什么决定比较器/可比较收集类中的升序或降序?

时间:2014-09-29 20:03:50

标签: java sorting collections interface comparable

我知道我们可以按照我们的要求对存储在Collection中的对象进行排序或排序。

虽然我得到了深刻的理解,但我不相信安排的升序和降序是通过(a-b) - >升序或(b-a) - >来实现的。降临在哪里" a"和" b"是我们选择比较的班级成员。

示例:

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

订购对象元素背后的逻辑是什么?如何"(this.grade - s.grade)"如果积极的1移动" 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文档,我的问题是:

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

&#34;这是怎么发生的?&#34;是我原来的问题。我阅读了文档,仍然无法弄清楚。

3 个答案:

答案 0 :(得分:9)

  

订购对象元素背后的逻辑是什么?如何&#34;(this.grade - s.grade)&#34;如果积极的1移动&#34; this.grade&#34;前面并放置&#34; s.grade&#34;接下来,为什么不通过其他方式?

使用负数来表示&#34;这比#34;正数要说&#34;这不仅仅是&#34;和0说&#34;这两件事是平等的#34;已有30多年的计算机语言。

  

谁验证比较结果(+ 1,-1,0)然后分别按升序/降序排列,是否有描述该部分内部工作的文档?

有几个内部类使用返回值来重新排序数组或集合中的元素,包括

Collections.sort()  Arrays.sort()  TreeSet

修改

要回答如何工作,您必须查看上面列出的每个类的源代码。其中一些是非常复杂的尝试使排序尽可能高效。但总的来说,这一切都归结为这样的代码:

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

答案 1 :(得分:7)

@DavidPrun好问题。我试过用一个例子来解释这个。

(x,y) - &gt; (2,5)

升序(x.compareTo(y)):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/mathematics"
        android:icon="@mipmap/ic_launcher"
        android:title="Mathematics" />
    <item
        android:id="@+id/chemistry"
        android:icon="@mipmap/ic_launcher"
        android:title="Chemistry" />
    <item
        android:id="@+id/physics"
        android:icon="@mipmap/ic_launcher"
        android:title="Physics" />
    <item
        android:id="@+id/biology"
        android:icon="@mipmap/ic_launcher"
        android:title="Biology" />
</menu>

降序(y.compareTo(x)):

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.

基本上,如果compareTo方法的结果为1,我们将始终在x前面移动y。

答案 2 :(得分:1)

Collections.sort()方法可以。

现在idk java中sort()的算法到底是什么,我相信它是一个修改过的双合并排序...但是在那个代码中的某个地方,compareTo(Comparable c)被调用来确定什么是大于/小于,生病了尝试用简单的算法解释:

让我说我有圆圈,通常你会根据它们的直径来比较圆圈......

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()是如何决定什么在哪里...你可以在评论中提出进一步解释