java - 如何对 Iterable 进行排序

标签 java sorting iterable

我有一个实现 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
}

我想获得一个排序副本作为我的一个自定义列表的自定义列表(如果我不需要我的比较器,那不会是问题,但这就是我到目前为止解决它的方法)

到目前为止我所做的是:

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

这很好用,但我想知道是否还有另一种(也许更优雅的方式)来实现我的目标。

最佳答案

核心 Java 库不公开与 Iterable 一起使用的排序算法。

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

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

关于java - 如何对 Iterable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36553550/

相关文章:

java - 调用 object.notifyAll() 是否会导致 Hotspot JVM 中的锁重偏/膨胀?

java - 无法调用 Collections.sort(arrayList)

java - 为什么我的分区算法返回 ArrayIndexOutOfBoundsException

java - 为什么即使实现了 Iterable,我也会收到 foreach 编译器错误?

python - python中的文件对象是可迭代的吗

java - 当我编辑类时,Eclipse Helios for Java 中的控制台未更新

java - setDefaultCloseOperation(HIDE_ON_CLOSE) 和系统托盘图标

Python 设置要为特定结果加减的数字序列

java - 如何录制 javasound 应用程序当前正在播放的声音?

algorithm - 这种排序算法的名称是什么?