如何对可迭代对象进行排序

Mai*_*fer 1 java sorting iterable

我有一个实现 Iterable 的自定义列表(不是集合!!)。我没有实现 List ,因为这会带来太多我不想要的方法,而且我不需要。

关于我的 CustomList 的更多信息:

  • 所有成员都是最终的
  • 每个 CustomList 都可以有一个“SubList”,它是另一个 CustomList
  • 每个 CustomList 必须只有一个 MyThing
  • 示例:假设 A 是 MyThing 的对象,B 是 MyThing 的对象,可以有一个只有 A(我们称之为 AList)的 CustomList 和一个带有 Item B 和 AList 作为 Sublist 的 CustomList。
  • CustomList 有一个可以接受 MyThings 数组的构造函数

所以这是我的班级:

public class CustomList implements Iterable<MyThing> {

   private final CustomList sublist;

   private final MyThing thing;

   // getters and other methods
}
Run Code Online (Sandbox Code Playgroud)

我有一个

Comparator<MyThing>
Run Code Online (Sandbox Code Playgroud)

我的事情:

public class MyThing {

   private final IntArrayList values;
   // more members and methods
}
Run Code Online (Sandbox Code Playgroud)

我想获得一个排序副本作为我的 CustomLists 之一的 CustomList(如果我不需要我的比较器,那不会是一个问题,但到目前为止我就是这样解决的)

到目前为止我所做的是:

  1. 将我的 CustomList 转换为列表
  2. 对该列表进行排序(使用比较器)
  3. 将其传输回 CustomList

这工作正常,但我想知道是否有另一种(也许更优雅的方式)来实现我的目标。

eri*_*son 5

核心 Java 库不公开与Iterable.

内置排序复制元素到临时数组。(ArrayList通过将其内部数组传递给 sort 函数来优化它。)我建议对您当前的方法进行的一个小改进是在 aObject[]而不是 a之间来回复制您的元素List。然后使用Arrays.sort()代替Collections.sort()。这节省了创建一个List没有真正使用的对象。

如果要对自定义集合执行就地排序,则可以自己实现排序算法。这并不是很难,但是更多的代码意味着更多的错误、更多的维护,并且您不会从与 JRE 捆绑的改进中受益(例如从“MergeSort”移动到“TimSort”)。只有你可以说这个好处是否值得。