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()); } };