【问题标题】:Making an efficient Java 8 sorted Spliterator from an array从数组中创建一个高效的 Java 8 排序 Spliterator
【发布时间】:2013-12-03 06:14:54
【问题描述】:
【问题讨论】:
标签:
java
java-8
spliterator
【解决方案1】:
您可以创建一个 ORDERED Spliterator:
-
starting from a Collection 与适当的iterator():
如果对应的 Collection.iterator() 记录了订单,则 Collection 具有遇到订单。如果是这样,遭遇顺序与记录的顺序相同。否则,集合没有遇到顺序。
通常,TreeSet.spliterator#getComparator 返回 TreeSet 的比较器,但 ArrayList.spliterator#getComparator 返回 null:顺序是通过递增索引。
-
或者,如果您有一个数组,则使用 Arrays 辅助类中提供的新便捷方法,例如 Arrays.spliterator(double[]):
拆分器报告 Spliterator.SIZED、Spliterator.SUBSIZED、Spliterator.ORDERED 和 Spliterator.IMMUTABLE。
或(Arrays.spliterator 所做的)通过显式提供特征,例如:Spliterators.spliterator(array, Spliterator.ORDERED);
当集合不与特定比较器(或数组)关联时,在“拆分”之前进行排序是有意义的。
【解决方案2】:
似乎没有预见到会有这样的Spliterator 具有非自然的顺序。但实施起来并不难。它可能看起来像这样:
class MyArraySpliterator implements Spliterator.OfInt {
final int[] intArray;
int pos;
final int end;
final Comparator<? super Integer> comp;
MyArraySpliterator(int[] array, Comparator<? super Integer> c) {
this(array, 0, array.length, c);
}
MyArraySpliterator(int[] array, int s, int e, Comparator<? super Integer> c) {
intArray=array;
pos=s;
end=e;
comp=c;
}
@Override
public OfInt trySplit() {
if(end-pos<64) return null;
int mid=(pos+end)>>>1;
return new MyArraySpliterator(intArray, pos, pos=mid, comp);
}
@Override
public boolean tryAdvance(IntConsumer action) {
Objects.requireNonNull(action);
if(pos<end) {
action.accept(intArray[pos++]);
return true;
}
return false;
}
@Override
public boolean tryAdvance(Consumer<? super Integer> action) {
Objects.requireNonNull(action);
if(pos<end) {
action.accept(intArray[pos++]);
return true;
}
return false;
}
@Override
public long estimateSize() {
return end-pos;
}
@Override
public int characteristics() {
return SIZED|SUBSIZED|SORTED|ORDERED|NONNULL;
}
@Override
public Comparator<? super Integer> getComparator() {
return comp;
}
}
但是 Java 8 还没有完全修复。也许决赛会有JRE提供的解决方案。