web-dev-qa-db-ja.com

compareToをオーバーライドする方法(Java)

私はプログラミングの初心者であり、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)...そしてそのリストからSetTreeSet)を作成しました:

SortUser sortUser = new SortUser();
Set<User> set = sortUser.sort(list);

最後に、次の順序のsetがあります:13、これはsetに2つのオブジェクトのみが存在することを意味します。何が悪いのでしょうか?

6
aLittleMind

ご覧のとおり、compareメソッドの実装が間違っています。に更新してもらえますか?

@Override
public int compareTo(User user) {
  return Integer.compare(age, user.age);
}
9
Roma Khomyshyn

TreeSetで行うことは不要です。繰り返したときに特定の順序が保証されているかどうかはわかりません。

ソート方法を

Collections.sort(list)

そして、要素がドロップされている理由についての私の推測は、あなたのcompareToメソッドが1はどのような場合でも、要素は常に他の要素以下であると見なされます。これはおそらくTreeSetでねじ込まれています。

1
Carcigenicate

以下の方法論に従ってください

文字列の場合。

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

ユーザークラス

 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);
0
rathna