如何对Iterable进行排序

时间:2016-04-11 15:54:31

标签: java sorting iterable

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

有关我的CustomList的更多信息:

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

所以这是我的班级:

public class CustomList implements Iterable<MyThing> {

   private final CustomList sublist;

   private final MyThing thing;

   // getters and other methods
}

我有一个

Comparator<MyThing>

MyThing:

public class MyThing {

   private final IntArrayList values;
   // more members and methods
}

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

到目前为止我所做的是:

  1. 将我的CustomList转换为List
  2. 对该列表进行排序(使用比较器)
  3. 将其转回CustomList
  4. 这很好用,但我想知道是否还有另一种(可能更优雅的方式)来实现我的目标。

2 个答案:

答案 0 :(得分:3)

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

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

如果要执行自定义集合的就地排序,可以自己实现排序算法。这并不是非常困难,但更多的代码意味着更多的错误,更多的维护,并且您不会受益于与JRE捆绑在一起的改进(例如从&#34; MergeSort&#34;转移到&#34;) ; TimSort&#34)。只有你可以说这个好处是否值得。

答案 1 :(得分:3)

从Iterable创建流,然后对流进行排序。

CustomList list = new CustomList();
Stream<MyThing> sorted = StreamSupport.stream(
        list.spliterator(), false)
    .sorted();