Autor
|
Tema: como puedo ordenar 2 arraylist ? (Leído 4,921 veces)
|
holamega12
Desconectado
Mensajes: 26
|
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 public GestionPersonas { ArrayList <Persona > Empleados = 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) } }
|
|
« Última modificación: 14 Febrero 2015, 11:30 am por holamega12 »
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
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: package net.elhacker; public class Person { private int age; public Person (String name, int age ) { this.name = name; this.age = age; } 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): package net.elhacker; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class MainClass { public static void main (String[] args ) { 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 @Override 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 @Override 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 @Override 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á: @Override 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
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
Mensajes: 26
|
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
Mensajes: 172
|
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;
}
|
|
« Última modificación: 14 Febrero 2015, 13:01 pm por robertofd1995 »
|
En línea
|
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
¿Se te duplican los elementos al combinar 2 listas en una sola? Es raro. Suponiendo que tienes una lista como variable de referencia: 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: public void addLists(List<?>... lists) { List<?> finalList = new ArrayList<>(); for(List<?) l : lists) { } return finalList; }
Ejemplo de uso: 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.
|
|
|
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
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
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. 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): 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. Clase.number = 12;
En respuesta a tu pregunta, tu necesitarías una variable "local"
|
|
|
En línea
|
|
|
|
holamega12
Desconectado
Mensajes: 26
|
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
Mensajes: 172
|
.
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
Mensajes: 625
|
@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í: 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.
|
|
|
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
|
|
|
|
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,576
|
17 Enero 2013, 00:00 am
por reygecko
|
|
|
[Ayuda] Ordenar los elementos de un ArrayList
Java
|
jscrip
|
4
|
3,317
|
9 Julio 2013, 07:42 am
por jscrip
|
|
|
Meter ArrayList en Otro ArrayList
Java
|
Tuplado
|
1
|
3,295
|
5 Enero 2014, 22:10 pm
por ~ Yoya ~
|
|
|
[Ayuda] Como puedo ordenar los elementos gráficos por coordenadas en Python
Scripting
|
Proxmond
|
3
|
4,359
|
16 Junio 2014, 16:48 pm
por daryo
|
|
|
como puedo ordenar nombres con edades?
Programación C/C++
|
JulianDronger
|
2
|
2,176
|
27 Febrero 2019, 22:18 pm
por JulianDronger
|
|