我有一个实现 Iterable 的自定义列表(不是集合!!)。我不实现 List,因为这会带来太多我不想要、也不需要的方法。
有关我的自定义列表的更多信息:
- 所有成员均为最终成员
- 每个 CustomList 都可以有一个“SubList”,它是另一个 CustomList
- 每个 CustomList 都必须有一个 MyThing
- 示例:假设 A 是 MyThing 的一个对象,B 是 MyThing 的一个对象,则可以存在一个仅包含 A 的 CustomList(我们称之为 AList)和一个包含 Item B 和 AList 作为子列表的 CustomList。
- CustomList 有一个构造函数,可以采用 MyThings 数组
这是我的类(class):
public class CustomList implements Iterable<MyThing> {
private final CustomList sublist;
private final MyThing thing;
// getters and other methods
}
我有一个
Comparator<MyThing>
我的事情:
public class MyThing {
private final IntArrayList values;
// more members and methods
}
我想获得一个排序副本作为我的一个自定义列表的自定义列表(如果我不需要我的比较器,那不会是问题,但这就是我到目前为止解决它的方法)
到目前为止我所做的是:
- 将我的 CustomList 转换为列表
- 对该列表进行排序(使用比较器)
- 将其传回自定义列表
这很好用,但我想知道是否还有另一种(也许更优雅的方式)来实现我的目标。
最佳答案
核心 Java 库不公开与 Iterable
一起使用的排序算法。
内置排序将元素复制到临时数组。 (ArrayList 通过将其内部数组传递给排序函数来对此进行优化。)我建议您对当前方法进行的一个小改进是在 Object[]
之间来回复制元素> 而不是 List
。然后使用 Arrays.sort() 而不是 Collections.sort()。这样可以节省创建一个未真正使用的 List
对象的时间。
如果您想对自定义集合执行就地排序,您可以自己实现排序算法。这并不是很难,但更多的代码意味着更多的错误、更多的维护,并且您不会从与 JRE 捆绑在一起的改进中受益(例如从“MergeSort”迁移到“TimSort”)。只有您才能说这种好处是否值得。
关于java - 如何对 Iterable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36553550/