【问题标题】:Making an efficient Java 8 sorted Spliterator from an array从数组中创建一个高效的 Java 8 排序 Spliterator
【发布时间】:2013-12-03 06:14:54
【问题描述】:

在 Java 8 中,提供了多种convenient utilities 来从数组构建高效的拆分器。但是,没有提供工厂方法来构建带有比较器的 Spliterator。显然 Spliterators 允许附加比较器;他们有一个getComparator() 方法和一个SORTED 属性。

图书馆作者应该如何构建SORTED Spliterators?

【问题讨论】:

    标签: 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提供的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        • 2013-10-14
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        相关资源
        最近更新 更多