
package CLaseAMG;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;

/**
 *
 * @author jdani
 */
public class main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // -Crear un Vector que contenga objetos de la clase Libro.
        
        // VECTOR es un tipo de COLLECTIONs similar a ArrayList.
        
        Vector<Libro> libros = new Vector<>();

        Libro libro1 = new Libro("123", "El principito", "Antonio S.", 200, true);
        Libro libro2 = new Libro("99", "Alicia", "Lewis Carroll", 234, false);
        Libro libro3 = new Libro("168", "Cien Años de soledad", "Marquez", 567, true);
        Libro libro4 = new Libro("87", "2001, Odisea Espacial", "Arthur C. Clark", 100, false);
        Libro libro5 = new Libro("290", "Hobbit", "Tolkien", 1200, true);
        Libro libro6 = new Libro("123", "El principito", "Antonio S.", 200, true);
        Libro libro7 = new Libro("1", "Alicia", "Lewis Carroll", 234, false);
        Libro libro8 = new Libro("13", "Cien Años de soledad", "Marquez", 567, true);
        Libro libro9 = new Libro("5", "2001, Odisea Espacial", "Arthur C. Clark", 100, false);
        Libro libro10 = new Libro("8", "Hobbit", "Tolkien", 1200, true);
        
        libros.add(libro1);
        libros.add(libro2);
        libros.add(libro3);
        libros.add(libro4);
        libros.add(libro5);
        libros.add(libro6);
        libros.add(libro7);
        libros.add(libro8);
        libros.add(libro9);
        libros.add(libro10);
        
    // -Iterar sobre los elementos de la lista mostrando información de cada objeto.
    
        System.out.println("Se itera el VECTOR -> Libros");
    
        Iterator<Libro> iterador =  libros.iterator();
        
        while (iterador.hasNext()){
            System.out.println(iterador.next());
        }
        
        //Opción si nos dice que los recorramos, sin ninguna especificación
        /*for (int i = 0; i < libros.size(); i++) {
            System.out.println(libros.get(i));
        }*/
        
    
    
    // -Clasificar los objetos de la lista en función de:
        // 1. Si están en papel o no.  
        // 2. A igualdad del primer criterio se clasificarán en función del número de páginas.
        // 3. A igualdad del segundo criterio se clasificarán en función de su isbn.
        
        System.out.println("Segunda iteración");
        Collections.sort(libros);
        
         
 
    // Usar Comparable.
    // -Iterar sobre los elementos de la lista una vez clasificado mostrando información de cada objeto.
    Iterator<Libro> iterador1 =  libros.iterator();
        while (iterador1.hasNext()){
            System.out.println(iterador1.next());
        }

    // Eliminar los elementos repetidos del Vector de la form más breve posible.
        libros = new Vector(new HashSet(libros));
        
    //Clasificar los elementos de la colección usando Comparator:
        // 1er criterio: Por titulo y a igualdad de titulo por numero de páginas.
        libros.sort(new Comparator<Libro>() {
        @Override
        public int compare(Libro l1, Libro l2){
            int resultado = l1.getTitulo().compareTo(l2.getTitulo()); 
            /*return (resultado!=0) ? resultado : Integer.compare(l1.getNum_paginas(),l2.getNum_paginas());*/
            
            if (resultado != 0){
                //Ordena por título (Si no es igual) devuelve el mayor. 
                // -1 Va primero.
                // 0 Iguales
                // 1 Va último 
                return resultado; 
            }else{
                return Integer.compare(l1.getNum_paginas(),l2.getNum_paginas());
            }
        }
    });
        // 2do criterio: Por isbn, a igualdad de isbn por titulo y a igualdad de titulo por autor.
        libros.sort(new Comparator<Libro>() {
        @Override
        public int compare(Libro l1, Libro l2){
            int resultado = l1.getIsbn().compareTo(l2.getIsbn());
            if (resultado != 0){
                return resultado;
            }else{ //En caso de que ISBN sean iguales
                int resultado2 = l1.getTitulo().compareTo(l2.getTitulo());
                if (resultado2 != 0){
                    return resultado2;
                }else{
                    return l1.getAutor().compareTo(l2.getAutor());
                }
                
            }
        }
        });
        
    // Probarlos en la función principal. 
    }
    
}
