- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用“Collections.sort”对数组列表进行排序。
这是我写的代码..
ArrayList<Student> arl = new ArrayList<>();
arl.add(new Student(1, "tom", 26));
arl.add(new Student(2, "brown", 22));
arl.add(new Student(3, "kate", 24));
arl.add(new Student(4, "brad", 23));
System.out.println(arl);
for(Student v : arl) {
System.out.println(v);
}
Collections.sort(arl, new Comparator<Student>(){
int count = 1;
public int compare(Student s1, Student s2) {
System.out.println("**compare "+count++ +" time***");
System.out.println("s1: "+s1.getName() + "(id: " + s1.getId()+")");
System.out.println("s2: "+s2.getName() + "(id: " + s2.getId()+")");
return s1.getName().compareTo(s2.getName());
}
});
我得到了一个排序列表,但我好奇的是为什么Java将学生id 3与学生id 2比较两次?我不习惯 Mergesort 的定义,但这是否是因为 Java 是通过称为 Mergesort 的算法进行排序的?
**compare 1 time***
s1: brown(id: 2)
s2: tom(id: 1)
**compare 2 time***
s1: kate(id: 3)
s2: brown(id: 2)
**compare 3 time***
s1: kate(id: 3)
s2: tom(id: 1)
**compare 4 time***
s1: kate(id: 3)
s2: brown(id: 2)
**compare 5 time***
s1: brad(id: 4)
s2: kate(id: 3)
**compare 6 time***
s1: brad(id: 4)
s2: brown(id: 2)
最佳答案
正如我之前所说,您提出的主要问题已经得到解答 here .
您在评论中提出的问题:
On the first comparison, why s1.getName gets the value of 'brown' istead of 'tom'. It compares student id 1 with student id 2 eventually, but it doesn't make sense to me...
它与 Collections.sort
实现直接相关,您可以找到 here (OpenJDK 8) 。在第一个排序阶段,调用 countRunAndMakeAscending
函数,我们可以在其定义中找到以下行:
if (c.compare(a[runHi++], a[lo]) < 0) { // Descending
...
这是您传递的比较器第一次被使用,并且碰巧传递给其 compare
方法的第一个参数是索引较高的元素 (a[runHi++]
) - 这就是它首先被打印的原因。
在我上面粘贴的链接中,您可以阅读此方法的完整实现。有关整个 Collections.sort
算法的更多信息已在第一个链接中问题的答案中介绍,因此如果您需要进一步的解释,请查看此内容。
关于java - 为什么归并排序可以比较两个项目两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61208761/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!