java - Java,使用比较器对 ArrayList 进行排序
问题描述
当我使用 Comparator 在作者姓名之后对库进行排序时,我只是巧合地“发现”了一些东西,它实际上工作得很好,但我不明白为什么。首先请看一下我的代码:
public class Bookshelf{
Collection<Literature> shelf = new ArrayList<Literature>();
ArrayList<Literature> unsorted = (ArrayList<Literature>)shelf;
public void printShelf() {
Comparator<Literature> compareBySurname= new Comparator<Literature>() {
@Override
public int compare(Literature o1, Literature o2) {
return o1.author.surname.compareTo(o2.author.surname);
}
};
unsorted.sort(compareBySurname);
for (Literature c : shelf)
System.out.println(c);
}
}
如您所见,我正在对“未排序ArrayList
”进行排序。但是在对它进行排序之后,我正在遍历集合“架子”并打印集合“架子”的元素。输出是按姓氏排序的元素列表。
为了实现我的意图,我实际上应该遍历ArrayList
“未排序”并打印元素(当然这个选项也有效)。所以我的问题是,为什么第一种方法实际上也有效?:D 所以我没有直接对集合“架子”进行排序,但我得到了一个排序列表。
提前致谢!
解决方案
ArrayList<Literature> unsorted = (ArrayList<Literature>)shelf;
不会创建新的ArrayList
. 它只是使unsorted
引用ArrayList
相同shelf
。它们不是不同的对象。你想要类似的东西
ArrayList<Literature> unsorted = new ArrayList<>(shelf); // <-- a different List.
推荐阅读
- python - 如何动态创建包含装饰器的函数?
- r - C 堆栈使用量太接近限制
- blockchain - 使用 indy-cli 创建池时出错
- python - 在 Python 中给定时间后退出尝试尝试
- html - 图像固定宽度的 css 浮动框中的 html+css 错误
- javascript - HMS AnalyticsKit Demo for Javascript 无法访问服务器
- php - Laravel 8.9.0 Auth Sacffolding 出现错误您的要求无法解决为一组可安装的软件包
- angular - 如何使 .position-sticky 停止在另一个角度组件(导航栏)下方?
- angular - Angular 8 在身份验证完成之前抑制 HTTP 调用
- r - 绘制参与者反应时间的直方图和点图?