como puedo ordenar 2 arraylist ?

Iniciado por holamega12, 13 Febrero 2015, 17:08 PM

0 Miembros y 1 Visitante están viendo este tema.

holamega12

Hola, estoy haciendo una pequeña practica, tengo 2 arraylist, por ejemplo
ArrayList<Persona> Pmayor = new ArrayList();
y luego
ArrayList<Persona>Pmenor = new ArrayList();


digamos que estos 2 arraylist los tengo detro de una clase, llamada GestionPersonas

he buscado por internet, y para ordenar, debo implementar la interface comparator, si la he implementado en la clase Persona eso si lo entiendo

A parte, tambien me han dicho que debo que cree un ArrayList temporal, para almacenar dichos objetos en uno, y luego ordenarlos por orden alfabetico, el problema, es que cuando los ordeno y muestro por pantalla, se van duplicando por pantalla

por ejemplo, si tengo de nombres
Pedro
Ana

cada vez que llamo a la funcion de ordenar y luego mostrar
se duplican y asi sucesivamente, si le doy a ordenar por nombre

Ana
Pedro
Ana
Pedro


¿como soluciono el error?
gracias

Código (java) [Seleccionar]
public GestionPersonas
{
ArrayList<Persona> Empleados = new ArrayList();
ArrayList<Persona>Jefes = new ArrayList();

ArrayList<Persona> temporal = new Arraylist();

//funcion para unir los 2 arrays

public void unePersonas ()
{
  temporal.addAll(Empleados);
  temporal.addAll(Jefes);
}


//para ordenadorlos, por ejemplo, por nombre alfabetico
public void ordenaPorNombre()
{
      Collections.sort(temporal, new OrdenarPersonasPorNombre());
//donde pongo new OrdenarPersonasPorNombre(), es donde tengo implementado la //interface comparator

}


//para mostrar por pantalla
public void mostrarResultado()
   {
         for (Persona e : temporal)
         System.out.println(e);
   }

}

3n31ch

#1
Buenas amigo, por lo que entiendo quieres ordenar personas, de menor a mayor, y de mayor a menor. (En el siguiente ejemplo, ordeno de menor a mayor por edad, y luego hago lo mismo por nombre, después de mayor a menor por nombre ^^)

Clase Persona:

Código (java) [Seleccionar]
package net.elhacker;

public class Person {
   
   private String name;
   private int age;

   public Person(String name, int age) {
       this.name = name;
       this.age = age;
   }
   
   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }
   
}



MainClass (En donde se ordena todo):

Código (java) [Seleccionar]

package net.elhacker;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class MainClass {

   public static void main(String[] args) {
       ArrayList<Person> list = new ArrayList();
       list.add(new Person("cName",22));
       list.add(new Person("Bname",2));
       list.add(new Person("Cname",5));
       list.add(new Person("Aname",0));
       list.add(new Person("Aname",2));
       list.add(new Person("aName",15));
       list.add(new Person("Ename",12));
       
        // ORDENO POR EDAD DE MENOR A MAYOR
       Collections.sort(list, new Comparator() {
           @Override
           public int compare(Object person1, Object person2) {
               return new Integer(((Person)person1).getAge()).compareTo(((Person)person2).getAge());
           }
       });
       
       for(Person p:list){
           System.out.println(p.getName() + " " + p.getAge());
       }
       
       System.out.println("\n-------------------\n");

        // ORDENO POR NOMBRE DE MENOR A MAYOR
       Collections.sort(list, new Comparator() {
           @Override
           public int compare(Object person1, Object person2) {
               return new Integer(((Person)person1).getName().charAt(0)).compareTo((int)((Person)person2).getName().charAt(0));
           }
       });
       
       for(Person p:list){
           System.out.println(p.getName() + " " + p.getAge());
       }
       
       System.out.println("\n-------------------\n");
       
       // ORDENO POR NOMBRE DE MAYOR A MENOR
       Collections.sort(list, new Comparator() {
           @Override
           public int compare(Object person1, Object person2) {
               return new Integer(((Person)person2).getName().charAt(0)).compareTo((int)((Person)person1).getName().charAt(0));
           }
       });
       
       for(Person p:list){
           System.out.println(p.getName() + " " + p.getAge());
       }
       
   }
   
}


La magia ocurre acá:

Código (java) [Seleccionar]
Collections.sort(list, new Comparator() {
           @Override
           public int compare(Object person1, Object person2) {
               return new Integer(((Person)person1).getName().charAt(0)).compareTo((int)((Person)person2).getName().charAt(0));
           }
       });


Exacto, como dices es necesario redefinir Comparator, usualmente esto se hace con números, pero si haces .getName().charAt(0) y lo casteas a int, obtendrás el código ascci y podrás ordenar los nombres mediante a su primera letra (primero mayusculas luego minusculas). Esto lo podrías mejorar si también comparas por la segunda letra..., pero eso te lo dejo a ti.

Lo único diferente entre mayor y menor || menor y mayor, seria que cambio la posición de la variable person1 y person2. Si quiero que sea de menor a mayor pongo person1 compareTo person2, pero si quiero de mayor a menor pongo person2 compareTo person1.

Por cierto, no me preocupe de leer tu codigo porque no utilizaste las etiquetas Code. Para hacer esto modifica tu mensaje, selecciona el codigo y en el combobox que dice GeSHi, pon Java. Recuerdalo para la proxima  :P




Si solo buscas ordenar para imprimir, y no quieres modificar el ArrayList, te recomendaría que la solución mas fácil es crear un ArrayList en un método y copiar el contenido del real. Luego ordenar tu ArrayList nuevo e imprimir con un foreach. Suerte ^^

holamega12

#2

gracias por contestar, no tengo problemas con ordenar un ArrayList, el problema, lo tengo, cuando tengo 2 ArrayList, en el que creo un tercer ArrayList, donde guardo el contenido de los 2 primeros, y llamo el metodo para ordenarlos, me ordena correctamente, el problema, es que por pantalla, cada vez que llamo a la funcion, es como si se duplicasen o añadiesen 2 veces, los nombres que he metido en el tercer ArrayList

he estado buscando, y he leido, que el tercer ArrayList donde guardo, los 3 ArrayList, no es temporal.... ¿como hago un ArrayList temporal?

robertofd1995

#3
A ver hay dos clases de variables que se pueden declaran , globales y locales :

Las globales se declaran en la clase y se pueden acceder en cualquier parte de la clase.
Las locales son aquellos que se declaran dentro de un metodo , al acabar ese metodo la variable creada desaparece.

Supongo que es con eso con lo que estas liado.

para hacer el arrayList temporal seria algo asi:

Pseudocodigo:

public ArrayList sort(ArraylList list){
ArrayList temp=new ArrayList();

blablalblaba ......

return temp;

}

Usuario Invitado

¿Se te duplican los elementos al combinar 2 listas en una sola? Es raro.

Suponiendo que tienes una lista como variable de referencia:

Código (=java) [Seleccionar]
private List<?> thirdList;

Y quieres añadir x listas a ella, las listas a añadir pueden ser locales, es decir estar en un método y allí se le pasan a otro método para que las añada a tu lista final:

Código (=java) [Seleccionar]
public void addLists(List<?>... lists) {
    List<?> finalList = new ArrayList<>();
    for(List<?) l : lists) {
        Collections.addAll(finalList,l);
    }
    return finalList;
}



Ejemplo de uso:
Código (java) [Seleccionar]
public void doSomething() {
    // logic here
    List<String> listOne = new ArrayList<>();
    List<Double> listTwo = new ArrayList<>();
    List<Integer> listThree = new ArrayList<>();
    // return a fully list with the 3 lists inside
    thirdList = addLists(listOne, listTwo, listThree);
}


No habría razón para una duplicidad de listas, a menos que haya elementos repetidos entre las listas.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

3n31ch

Cita de: robertofd1995 en 14 Febrero 2015, 12:59 PM
A ver hay dos clases de variables que se pueden declaran , globales y locales :

Las globales se declaran en la clase y se pueden acceder en cualquier parte de la clase.
Las locales son aquellos que se declaran dentro de un metodo , al acabar ese metodo la variable creada desaparece.


Variables globales? wut?

Nose, pero yo tengo entendido que las variables Globales no existen en java. Quizás las clases, pero no variables.

Si quieres definir que existen clases de variables, entonces yo diría que existen 3 clases de variables.

Variables "locales": Se declaran dentro de métodos, cuando el método finaliza la ejecución, entonces la variable desaparece.

public void myMethod(){
    int number = 5;
    System.out.println(number);
} // Cuando el método termina de ejecutarse (después de imprimir number) entonces la variable number desaparece.

Variables de "objetos", mas bien le diría atributos (o algún otro nombre real): Son variables que se crean al inicializar un objeto. una vez el objeto es eliminado, la variable desaparece.

Código (java) [Seleccionar]
public class Class {
   
    private int number; // variable de objeto
   
    public Class() {
        this.number = 5;
    }

}


Y tercero, (las que creo que confunde nuestro amigo), son las variables de clase: Las variables de clase se crean cuando inicia la ejecución del programa y finalizan cuando finaliza la ejecución del programa. (No son variables globales por el simple hecho de que pertenecen a una clase):


Código (java) [Seleccionar]
public class Class {
   
    public static int number = 5;  // Variable de clase (la diferencias de una de objetos porque tiene un "static")
   
    public Class() {
    }

}


A estas variables accedes poniendo el nombre de la Clase (por convención, no utilices un objeto para acceder a ella) y luego el nombre de la variable.

Código (java) [Seleccionar]
Clase.number = 12;

En respuesta a tu pregunta, tu necesitarías una variable "local"

holamega12

bueno gracias a todos por las respuestas, finalmente lo he conseguido arreglar, el problema, lo tenia en una clase que habia creado, y que creaba los objetos, usando el constructor parametrizado,  por lo que intente crear objetos, con los setters correspondientes, y tachannn, se ha conseguido ordenar los objetos, asi que si alguno de vosotros os da problemas por ordenar objetos, intentad usar los setters de la clase correspondientes.

robertofd1995

Cita de: Nac-ho en 14 Febrero 2015, 19:16 PM
.

Variables de "objetos", mas bien le diría atributos (o algún otro nombre real): Son variables que se crean al inicializar un objeto. una vez el objeto es eliminado, la variable desaparece.

A esas me referia , cierto que no me exprese de la manera adecuada.

¿Pero porque dices que tienes entendido que las variables globales en java no existen?

Quiero decir yo entiendo como una variable global a los que tu llamas atributos , que es lo que entiendes tu por variable global? Es solo por curiosidad jaja.



Usuario Invitado

@robertofd1995: Variables globales se les llama a variables que están visibles para toda la aplicación. Si algunas vez has usado C/C++ por ejemplo declaras una variable global así:

Código (=cpp) [Seleccionar]

int variableGlobal = 5;

int main() {
...
}


Si te das cuenta esa variable es accesible por toda la aplicación, se puede acceder a ella desde cualquier ámbito. Ésto por supuesto, no es recomendable ya que cuando la aplicación escala más y más pueden haber problemas si accidentalmente cambiamos el valor de dicha variable y como es accedida desde muchos ámbitos, la información que se produzca con ella será errónea.

Una variable de referencia es una variable que puede ser accedida solo mediante una instancia de la clase que tiene dicha variable, también llamado campo.

Hay que tratar a las cosas tal cuales son. No es ético llamar variables globales a las de referencia si ya están pre-establecidos los significados y usos.

Un saludo.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein