私はプログラミングの初心者であり、2つのクラスがあります。ファーストクラス:
public class User implements Comparable<User>
フィールドint age
、インターフェイスComparableのコンストラクタおよびオーバーライドされたメソッド:
@Override
public int compareTo(User user) {
return user.age >= age ? -1 : 0;
}
2番目のクラスはpublic class SortUser
リストからSetコレクションを作成するメソッド:
public Set<User> sort(List<User> list) {
Set<User> result = new TreeSet<>();
for (User user : list) {
result.add(user);
}
return result;
}
セット内のすべてのUser
オブジェクトをソートする必要があるように思えますが、3つの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);
(リストの順序は次のとおりです:312
)...そしてそのリストからSet
(TreeSet
)を作成しました:
SortUser sortUser = new SortUser();
Set<User> set = sortUser.sort(list);
最後に、次の順序のset
があります:13
、これはset
に2つのオブジェクトのみが存在することを意味します。何が悪いのでしょうか?
ご覧のとおり、compareメソッドの実装が間違っています。に更新してもらえますか?
@Override
public int compareTo(User user) {
return Integer.compare(age, user.age);
}
TreeSet
で行うことは不要です。繰り返したときに特定の順序が保証されているかどうかはわかりません。
ソート方法を
Collections.sort(list)
そして、要素がドロップされている理由についての私の推測は、あなたのcompareTo
メソッドが1
はどのような場合でも、要素は常に他の要素以下であると見なされます。これはおそらくTreeSet
でねじ込まれています。
以下の方法論に従ってください
文字列の場合。
public static Comparator<Employee> NameComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
};
整数値の場合
public static Comparator<Employee> SalaryComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return (int) (e1.getSalary() - e2.getSalary());
}
};
ユーザークラス
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;
}
}
リストを準備する
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);
ソート用
Set<User> list1 = new TreeSet(list);