web-dev-qa-db-ja.com

Comparator / Comparableコレクションクラスの昇順または降順を決定するものは何ですか?

要件に応じてコレクションに格納されているオブジェクトを並べ替えまたは順序付けできることを理解しています。

理解は深まりますが、(a-b)-> ascendingまたは(b-a)-> descendingによって「a」と「b」がクラスである場合、配列の昇順と降順が達成されていることに確信が持てません。比較することを選択したメンバー。

例:

public int compareTo(Student s) {
     return this.grade - s.grade; //ascending order 
    // return s.grade - this.grade; // descending order
}

オブジェクト要素の順序付けの背後にあるロジックは何ですか?正の1の場合、「(this.grade-s.grade)」が「this.grade」を前に移動し、次に「s.grade」を順番に配置しますが、他の方法ではありませんか?比較結果(+ 1、-1、0)を検証し、それぞれ昇順または降順で並べ替えるのはだれですか。この部分の内部動作を説明するドキュメントはありますか?

public class Student implements Comparable <Student>{
    String name;
    int grade;
    public Student(String name, int grade) {
        this.name = name;
        this.grade = grade;
    }
    public int compareTo(Student s) {
         return this.grade - s.grade; //ascending order 
        // return s.grade - this.grade; // descending order
    }
    public String toString() {
        return this.name + ", " + this.grade;
    }
}

共有してください、ありがとうございました!


編集:

Java docs、私の質問はこれです:

sort these grades (13, 2)

Case ascending -> return this.grade - s.grade;

picture in my mind: 
compare (13, 2) , (13 - 2) > 0 so move 2 to front.
result -> 2, 13
------
Case descending -> return s.grade - this.grade;

picture in my mind: 
compare (2, 13) , (2 - 13) < 0 so move 13 to front.

result -> 13, 2

「これはどうして起こるの?」私の最初の質問でした。私はドキュメントを読みましたが、まだ理解できませんでした。

19
David Prun

オブジェクト要素の順序付けの背後にあるロジックは何ですか?正の1の場合、「(this.grade-s.grade)」が「this.grade」を前に移動し、次に「s.grade」を順番に配置しますが、他の方法ではありませんか?

負の数を使用して「これはそれより小さい」、正の数を使用して「これはそれより大きい」、0を使用して「これら2つのものは等しい」と言うのは、30年以上前から多くのコンピュータ言語で行われてきました。

比較結果(+ 1、-1、0)を検証してから昇順/降順で並べ替えるのは誰ですか?この部分の内部動作を説明するドキュメントはありますか?

戻り値を使用して配列またはコレクションの要素を並べ替える内部クラスがいくつかあります。

Collections.sort()Arrays.sort()TreeSet

[〜#〜]編集[〜#〜]

どのように機能するかを回答するには、上記の各クラスのソースコードを確認する必要があります。それらのいくつかは、ソートを可能な限り効率的にすることを試みるために非常に複雑です。しかし、一般的に、すべては次のようなコードに要約されます。

if( data[i].compareTo(data[j]) > 0 ){
   // swap data[i] and  data[j]
}
13
dkatzel

@DavidPrunいい質問です。例を挙げて説明してみました。

(x、y)->(2、5)

昇順(x.compareTo(y)):

if x.compareTo(y) == 1, then x > y , since y is smaller than x, you would have to move y in front of x.

2.compareTo(5) == 1 , Then don't move 5 in front of 2.

降順(y.compareTo(x)):

if y.compareTo(x) == 1, then y > x , since y is greater than x, you would have to move y in front of x.

5.compareTo(2) == -1 , Move 5 in front of 2.

基本的に、compareToメソッドの結果が1の場合、常にyをxの前に移動します。

8
Jay Modi

Collections.sort()メソッドにはあります。

Java=のsort()のアルゴリズムが正確に何であるかをidkします。変更された二重マージされたソートと見なします...しかし、コードのどこかでcompareTo(Comparable c)が呼び出され、よりも大きい/小さい、単純なアルゴリズムで説明しようとします:

私がCircleを持っていると言うことができます、通常、uは直径で円を比較するので...

public class Circle implements Comparable<Cricle> {
 int diameter;
 //constructor
 public int compareTo(Circle c){
  return this.diameter-c.diameter;
   }

円の配列を作ってみましょう:

ArrayList<Circle> collection = new ArrayList;
collection.add(new Circle(10)); // and more circles

次に、これがCollection.sort()で定義されたソートアルゴリズムであると仮定します。

  Comparable tmp;
  for(int i=0;i<collection.size();i++){
   for(int j=i;j<collection.size();j++){
    if(collection.get(j).compareTo(collection.get(i)>0){
      //swap
      tmp=collection.get(i);
      collection.set(i,collection.get(j));
      collection.set(j,tmp);
     }
    }
   }

今私はソートアルゴリズムを書いたかわからない(昇順/降順)私はそれを速くやっただけですが、sort()がどこに行くのかをどのように決定しているのかという点は明らかです...詳細についてはコメントで質問できます

1
vlatkozelka