开发者社区> 问答> 正文

使用stream对两个未存储的数组进行排序和映射

我使用了一个函数,它接受IntStream中的任何一个,尽管我也替换了来自用户整数的数组,尽管在一些地方遇到了编译器错误,试图进行Java归并、排序和分割。

//intStream1 = intStream1.sorted();
//intStream2 = intStream2.sorted();
// IntStream mergedSt = Stream.of(intStream1, intStream2) 
              .flatMap(Stream::of);     

//    List<Integer> mergeArr1 = 
// intStream1.boxed().collect(Collectors.toList()).subList(0,len1);

static void mergeArraysWithStreams(IntStream intStream1, IntStream intStream2) 
 {
  long len1 = intStream1.count();
  long len2 = intStream2.count();
  intStream1 = intStream1.sorted();
  intStream2 = intStream2.sorted();
  int[] mergedStreamArray = IntStream.concat(intStream1,
  intStream2).toArray();  

for(int i = 0;i<(int)len1;i++)
    System.out.println(mergedStreamArray[i]);
for(int j = (int)len1;j<(int)len2;j++)
    System.out.println(mergedStreamArray[j]);
}

public static void main(String[] args) {
try {
    BufferedReader buffer = new BufferedReader(new In 
   putStreamReader(System.in));
    int[] array = new int[100];
    int[] array2 = new int[100];
    String[] input;
    String[] input2;
    int n = Integer.parseInt(buffer.readLine());
    while(n>0) {
        input = buffer.readLine().split(" ");
        input2 = buffer.readLine().split(" ");
        n--;
        for(int i = 0;i<n;i++){
            array[i]=Integer.parseInt(input[i]);
            array2[i] = Integer.parseInt(input2[i]);
        }
        IntStream arr = Arrays.stream(array);
        IntStream arr1 = Arrays.stream(array2);     
        mergeArraysWithStreams(arr, arr1);
    }


   } catch(IOException ex) {
    System.out.println(ex);
   }
 }

我找不到范围的符号。我已经尝试使用流连接两个数组进行合并

mergedArray.boxed().collect(Collectors.toList()).subList(len1+1, mergedArray.length);

我仍然会得到这个函数的错误,因为我已经开始了这个错误

1
3 4 1
3 9 7
 Exception in thread "main" java.lang.IllegalStateException: stream has 
 already been operated upon or closed
 at java.util.stream.AbstractPipeline.<init>(Unknown Source)
 at java.util.stream.IntPipeline.<init>(Unknown Source)
 at java.util.stream.IntPipeline$StatefulOp.<init>(Unknown Source)
 at java.util.stream.SortedOps$OfInt.<init>(Unknown Source)
 at java.util.stream.SortedOps.makeInt(Unknown Source)
 at java.util.stream.IntPipeline.sorted(Unknown Source)
 at MergeArray.mergeArraysWithStreams(MergeArray.java:18)
 at MergeArray.main(MergeArray.java:47)

但是它没有看到盒子。我有java.util的导入;. lang;所以我没有我错过了一些东西。尝试对两个数组排序,并通过两个合并数组的顺序返回两个长度相同的数组。我试图得到的解决方案是一行IntStream.range(0,len1). flatmap (). collection . tolist()(类似于我所要求的,但它将产生两个列表从两个流在一个声明中,我认为这是可能的)。


问题来源:stackoverflow

展开
收起
七天一失眠 2020-03-21 10:27:36 984 0
1 条回答
写回答
取消 提交回答
  • 做一个优秀的阿里云志愿者

    流是延迟求值的,这意味着一旦流到达终端表达式,就对元素进行操作。当它这样做时,流被消耗,不能再被使用。这里你使用一个终端操作收集,然后你试图重用流:

    mergedArray.boxed().collect(Collectors.toList()).subList(len1+1, mergedArray.length);
    

    正如@GBlodgett所注意到的,您在这个流实例上使用的另一个操作是count()(它是终端)和sort()。 我不确定Stream是否是你的算法的正确工具-你正在创建一个流的数组,然后一个列表的流。


    答案来源:stackoverflow

    2020-03-21 10:29:24
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
HBase2.0重新定义小对象实时存取 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载