elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  como puedo ordenar 2 arraylist ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: como puedo ordenar 2 arraylist ?  (Leído 4,605 veces)
holamega12

Desconectado Desconectado

Mensajes: 26


Ver Perfil
como puedo ordenar 2 arraylist ?
« en: 13 Febrero 2015, 17:08 pm »

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
  1. public GestionPersonas
  2. {
  3. ArrayList<Persona> Empleados = new ArrayList();
  4. ArrayList<Persona>Jefes = new ArrayList();
  5.  
  6. ArrayList<Persona> temporal = new Arraylist();
  7.  
  8. //funcion para unir los 2 arrays
  9.  
  10. public void unePersonas ()
  11. {
  12.   temporal.addAll(Empleados);
  13.   temporal.addAll(Jefes);
  14. }
  15.  
  16.  
  17. //para ordenadorlos, por ejemplo, por nombre alfabetico
  18. public void ordenaPorNombre()
  19. {
  20.       Collections.sort(temporal, new OrdenarPersonasPorNombre());
  21. //donde pongo new OrdenarPersonasPorNombre(), es donde tengo implementado la //interface comparator
  22.  
  23. }
  24.  
  25.  
  26. //para mostrar por pantalla
  27. public void mostrarResultado()
  28.    {
  29.          for (Persona e : temporal)
  30.          System.out.println(e);
  31.    }
  32.  
  33. }


« Última modificación: 14 Febrero 2015, 11:30 am por holamega12 » En línea

3n31ch


Desconectado Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #1 en: 13 Febrero 2015, 19:39 pm »

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
  1. package net.elhacker;
  2.  
  3. public class Person {
  4.  
  5.    private String name;
  6.    private int age;
  7.  
  8.    public Person(String name, int age) {
  9.        this.name = name;
  10.        this.age = age;
  11.    }
  12.  
  13.    public String getName() {
  14.        return name;
  15.    }
  16.  
  17.    public void setName(String name) {
  18.        this.name = name;
  19.    }
  20.  
  21.    public int getAge() {
  22.        return age;
  23.    }
  24.  
  25.    public void setAge(int age) {
  26.        this.age = age;
  27.    }
  28.  
  29. }


MainClass (En donde se ordena todo):

Código
  1. package net.elhacker;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6.  
  7. public class MainClass {
  8.  
  9.    public static void main(String[] args) {
  10.        ArrayList<Person> list = new ArrayList();
  11.        list.add(new Person("cName",22));
  12.        list.add(new Person("Bname",2));
  13.        list.add(new Person("Cname",5));
  14.        list.add(new Person("Aname",0));
  15.        list.add(new Person("Aname",2));
  16.        list.add(new Person("aName",15));
  17.        list.add(new Person("Ename",12));
  18.  
  19.         // ORDENO POR EDAD DE MENOR A MAYOR
  20.        Collections.sort(list, new Comparator() {
  21.            @Override
  22.            public int compare(Object person1, Object person2) {
  23.                return new Integer(((Person)person1).getAge()).compareTo(((Person)person2).getAge());
  24.            }
  25.        });
  26.  
  27.        for(Person p:list){
  28.            System.out.println(p.getName() + " " + p.getAge());
  29.        }
  30.  
  31.        System.out.println("\n-------------------\n");
  32.  
  33.         // ORDENO POR NOMBRE DE MENOR A MAYOR
  34.        Collections.sort(list, new Comparator() {
  35.            @Override
  36.            public int compare(Object person1, Object person2) {
  37.                return new Integer(((Person)person1).getName().charAt(0)).compareTo((int)((Person)person2).getName().charAt(0));
  38.            }
  39.        });
  40.  
  41.        for(Person p:list){
  42.            System.out.println(p.getName() + " " + p.getAge());
  43.        }
  44.  
  45.        System.out.println("\n-------------------\n");
  46.  
  47.        // ORDENO POR NOMBRE DE MAYOR A MENOR
  48.        Collections.sort(list, new Comparator() {
  49.            @Override
  50.            public int compare(Object person1, Object person2) {
  51.                return new Integer(((Person)person2).getName().charAt(0)).compareTo((int)((Person)person1).getName().charAt(0));
  52.            }
  53.        });
  54.  
  55.        for(Person p:list){
  56.            System.out.println(p.getName() + " " + p.getAge());
  57.        }
  58.  
  59.    }
  60.  
  61. }
  62.  

La magia ocurre acá:

Código
  1. Collections.sort(list, new Comparator() {
  2.            @Override
  3.            public int compare(Object person1, Object person2) {
  4.                return new Integer(((Person)person1).getName().charAt(0)).compareTo((int)((Person)person2).getName().charAt(0));
  5.            }
  6.        });

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 ^^


« Última modificación: 13 Febrero 2015, 19:46 pm por Nac-ho » En línea

holamega12

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #2 en: 14 Febrero 2015, 11:33 am »


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?
« Última modificación: 14 Febrero 2015, 12:45 pm por holamega12 » En línea

robertofd1995

Desconectado Desconectado

Mensajes: 172


Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #3 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.

Supongo que es con eso con lo que estas liado.

para hacer el arrayList temporal seria algo asi:
Código:
Pseudocodigo:

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

blablalblaba ......

return temp;

}
« Última modificación: 14 Febrero 2015, 13:01 pm por robertofd1995 » En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #4 en: 14 Febrero 2015, 15:17 pm »

¿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
  1. 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
  1. public void addLists(List<?>... lists) {
  2.    List<?> finalList = new ArrayList<>();
  3.    for(List<?) l : lists) {
  4.        Collections.addAll(finalList,l);
  5.    }
  6.    return finalList;
  7. }


Ejemplo de uso:
Código
  1. public void doSomething() {
  2.    // logic here
  3.    List<String> listOne = new ArrayList<>();
  4.    List<Double> listTwo = new ArrayList<>();
  5.    List<Integer> listThree = new ArrayList<>();
  6.    // return a fully list with the 3 lists inside
  7.    thirdList = addLists(listOne, listTwo, listThree);
  8. }

No habría razón para una duplicidad de listas, a menos que haya elementos repetidos entre las listas.
En línea

"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


Desconectado Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #5 en: 14 Febrero 2015, 19:16 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
  1. public class Class {
  2.  
  3.    private int number; // variable de objeto
  4.  
  5.    public Class() {
  6.        this.number = 5;
  7.    }
  8.  
  9. }

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
  1. public class Class {
  2.  
  3.    public static int number = 5;  // Variable de clase (la diferencias de una de objetos porque tiene un "static")
  4.  
  5.    public Class() {
  6.    }
  7.  
  8. }

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
  1. Clase.number = 12;

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

holamega12

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #6 en: 14 Febrero 2015, 21:07 pm »

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.
En línea

robertofd1995

Desconectado Desconectado

Mensajes: 172


Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #7 en: 15 Febrero 2015, 15:51 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.


En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: como puedo ordenar 2 arraylist ?
« Respuesta #8 en: 15 Febrero 2015, 16:31 pm »

@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
  1. int variableGlobal = 5;
  2.  
  3. int main() {
  4. ...
  5. }

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.
En línea

"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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Cómo ordenar un ArrayList de elementos-registro según uno de sus campos?
Java
reygecko 1 4,403 Último mensaje 17 Enero 2013, 00:00 am
por reygecko
[Ayuda] Ordenar los elementos de un ArrayList
Java
jscrip 4 3,118 Último mensaje 9 Julio 2013, 07:42 am
por jscrip
Meter ArrayList en Otro ArrayList
Java
Tuplado 1 3,084 Último mensaje 5 Enero 2014, 22:10 pm
por ~ Yoya ~
[Ayuda] Como puedo ordenar los elementos gráficos por coordenadas en Python
Scripting
Proxmond 3 4,016 Último mensaje 16 Junio 2014, 16:48 pm
por daryo
como puedo ordenar nombres con edades?
Programación C/C++
JulianDronger 2 1,933 Último mensaje 27 Febrero 2019, 22:18 pm
por JulianDronger
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines