Soy principiante en programación y tengo dos clases. Primera clase es:
public class User implements Comparable<User>
con campo int age
, constructor y método anulado de interfaz Comparable:
@Override public int compareTo(User user) { return user.age >= age ? -1 : 0; }
La segunda clase es public class SortUser
con un método para hacer una colección Set a partir de una Lista:
public Set<User> sort(List<User> list) { Set<User> result = new TreeSet<>(); for (User user : list) { result.add(user); } return result; }
Me parece que todos los objetos de User
en un conjunto deben ordenarse, pero cuando hice una lista con 3 objetos de User
...
User a = new User(1); User b = new User(2); User c = new User(3); List<User> list = new ArrayList<>(); list.add(c); list.add(a); list.add(b);
(Ahora el orden de la lista es: 312
) ...y creó un Set
( TreeSet
) de esa lista:
SortUser sortUser = new SortUser(); Set<User> set = sortUser.sort(list);
Al final tengo un set
con ese orden: 13
, significa que solo hay dos objetos en el set
. ¿Qué está yendo mal?
Como veo, tiene una implementación incorrecta del método de comparación. ¿Podrías actualizarlo a?
@Override public int compareTo(User user) { return Integer.compare(age, user.age); }
Lo que estás haciendo con el TreeSet
es innecesario. No estoy seguro de que estén garantizados para tener cierto orden cuando itera.
Simplemente reemplace su método de clasificación con
Collections.sort(list)
Y mi suposición de por qué se descarta un elemento es que su método compareTo
nunca devuelve un 1
en ningún caso, por lo que los elementos siempre se consideran menores o iguales a otros elementos, lo que probablemente esté arruinando el TreeSet
.
Siga la siguiente metodología
En caso de cadena.
public static Comparator<Employee> NameComparator = new Comparator<Employee>() { @Override public int compare(Employee e1, Employee e2) { return e1.getName().compareTo(e2.getName()); } };
En caso de valores enteros
public static Comparator<Employee> SalaryComparator = new Comparator<Employee>() { @Override public int compare(Employee e1, Employee e2) { return (int) (e1.getSalary() - e2.getSalary()); } };