什么决定了Comparator / 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
}

订购对象元素背后的逻辑是什么?如果正数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文档,我的问题是这样的:

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

“这是怎么发生的?” 是我最初的问题。我读了文档,仍然不知道。

dkatzel:

订购对象元素背后的逻辑是什么?如果正数1如何将“(this.grade-s.grade)”移到“ this.grade”的前面,然后将“ s.grade”放在后面,为什么不这样呢?

在许多计算机语言中,使用负数表示“小于此数量”,使用正数表示“大于此数量”和0表示“这两个条件相等”已经使用了30多年。

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

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

Collections.sort() Arrays.sort() TreeSet

编辑

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

什么决定楠和无限在java中除法运算

设计决定 - 什么是Math.java单独RandomNumberGeneratorHolder类的使用/优势?

为什么Java中PECS通配符类型的使用者是Comparable和Comparator

Java:为什么我不能在Comparator中抛出异常?

在Java中放置Comparator类的最佳位置是什么

什么真正决定JavaScript模块在.html中执行的顺序?

java.util.Comparator.naturalOrder采用<T扩展Comparable <?超级T >>并返回Comparator <T>-为什么?

是什么决定foldLeft中的“ A”类型?

Swift-什么决定词典集合的顺序?

如何正确决定Angular 2中的组件是什么?

是什么决定了Azure Devops积压中显示的内容?

在选择排序中,降序数组的性能比升序数组更快。为什么?

什么决定了环境中存在什么?

决定Google Geochart中Z-Index的因素是什么?

什么决定HostingEnvironment.ApplicationID中的/信息格式?

什么决定了getView()的position参数中的值范围?

未定义div类的宽度时,由什么决定?

Scala中的基础集合类是什么?

如何使用 Comparator<Object> 进行升序、降序而不进行排序

什么决定了 Ubuntu 中的 NIC 设备名称

在决定接口还是抽象类时,正确的实现是什么?

什么决定数组是否可以在 Java 中容纳对象

什么决定了 VisualStudio 中的哪些项目被视为 Azure Devops Build 中的发布项目

什么决定了 DjangoRestFramework 中哪些字段可以更新

用 C++ 编写一个函数,其中客户端决定从类中运行什么函数?

什么 hadoop 配置设置决定了 spark 中可用的节点数?

什么决定了不同加密算法中的 BIGNUM 大小?

将集合转换为列表时,什么决定了项目顺序?

在气流 DAG 中,什么决定了任务所在的层?