Reputation: 193
I'm a beginner in programming and I have two classes. First class is:
public class User implements Comparable<User>
with field int age
, constructor and overrided method of interface Comparable:
@Override
public int compareTo(User user) {
return user.age >= age ? -1 : 0;
}
Second class is
public class SortUser
with a method to make a Set collection from a List:
public Set<User> sort(List<User> list) {
Set<User> result = new TreeSet<>();
for (User user : list) {
result.add(user);
}
return result;
}
It seems to me that all User
objects in a Set should be sorted, but when I made a List with 3 User
objects...
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);
(Now the list's order is: 312
)
...and created a Set
(TreeSet
) from that list:
SortUser sortUser = new SortUser();
Set<User> set = sortUser.sort(list);
At the end I have a set
with that order: 13
, it means that only two objects are in the set
. What is going wrong?
Upvotes: 15
Views: 73783
Reputation: 375
You might want to try this:
@Override
public int compareTo(User user) {
if (this == user){
return 0;
}
if (user != null){
return this.age.compareTo(user.getAge())
}
}
Upvotes: 0
Reputation: 1
class Scratch {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
list.add(new User(3));
list.add(new User(1));
list.add(new User(2));
Collections.sort(list);
list.forEach(el -> System.out.println(el.age));
}
}
class User implements Comparable<User> {
int age;
User(int age) {
this.age = age;
}
@Override
public int compareTo(User user) {
return this.age >= user.age ? -1 : 0;
}
}
Upvotes: 0
Reputation: 3313
Please follow below methodology
In case of string.
public static Comparator<Employee> NameComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
};
In case of Integer values
public static Comparator<Employee> SalaryComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return (int) (e1.getSalary() - e2.getSalary());
}
};
Upvotes: 1
Reputation: 1083
User class
public class User implements Comparable<User>{
int age;
User(int age){age=age;}
@Override
public int compareTo(User user) {
return this.age >= age ? -1 : 0;
}
}
prepare list
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);
for sorting
Set<User> list1 = new TreeSet(list);
Upvotes: 0
Reputation: 45750
What you're doing with the TreeSet
is unnecessary. I'm not sure they're guaranteed to have certain ordering when iterated.
Just replace your sort method with
Collections.sort(list)
And my guess as to why an element is being dropped is your compareTo
method never returns a 1
in any case, so elements are always considered to be less than or equal to other elements, which is probably screwing with the TreeSet
.
Upvotes: 1
Reputation: 1152
As I see you have wrong implementation of compare method. Could you update it to?
@Override
public int compareTo(User user) {
return Integer.compare(age, user.age);
}
Upvotes: 14