我有一个实现Iterable的自定义List(不是Collection !!)。我没有实现List,因为这会带来太多我不想要的方法,而且我不需要。
有关我的CustomList的更多信息:
所以这是我的班级:
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那不会是一个问题,但到目前为止我就是这样解决的)
到目前为止我所做的是:
这很好用,但我想知道是否还有另一种(可能更优雅的方式)来实现我的目标。
答案 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();