【问题标题】:Arraylist of Arrays with Java Stream带有 Java 流的数组的 Arraylist
【发布时间】:2016-10-02 18:08:11
【问题描述】:

我有一个方法,它返回一个带有数组的 ArrayList,如下所示:

{1,2,3}, {4,5,6}, {7,8,9}....

public int[] simulatePlays(BitBoard board, int number){
    int[] count = {0,0,0};

    while (number > 0){
        BitBoard b = new BitBoard(board);
        count[playRandomly(b)+1] += 1;
        number--;
    }
    return count;
}

public ArrayList<int[]> evaluateMoves(BitBoard board, int number){
    ArrayList<Integer> moves = board.listMoves();
    ArrayList<int[]> values = new ArrayList<>();

    for(int move : moves){
        board.makeMove(move);
        values.add(simulatePlays(board, number));
        board.undoMove();
    }
    return values;
}

现在我需要对array[3]的值进行倍数

我的意思是每个数组的第三个值 3,6,9 所示。

用一些东西然后选择最大值的索引。我可以用两个 for 循环来做到这一点,但我更愿意使用 Streams。

我想要的 Python 代码是:

values = [r* board.turn for l,m,r in evaluate_moves(board)]
max_val = max(values)
max_idx = values.index(max_val)

有人可以帮我吗?

【问题讨论】:

  • array[3] 不会编译,我认为你应该提供一个代码来处理。
  • 请注意,就其价值而言,流和与索引有关的任何事情都无法相处。

标签: java python arrays arraylist java-stream


【解决方案1】:

由于 java 流的性质,不可能从源中检索元素索引。例如,您可以使用 parallelStream() 而不是 stream 并且由于源将被 Spliterator 拆分,它仍然应该可以完美运行。

要获取有关仅具有某个值的第三个元素的最大倍数的信息,您可以使用如下逻辑:

List<int[]> moves = new ArrayList<>();
moves.add(new int[]{1, 2, 3});
moves.add(new int[]{4, 5, 6});
moves.add(new int[]{7, 8, 9});

int someValue = 1;
Integer maxValue = moves.stream().map(array -> array[2] * someValue).reduce(0, Integer::max);
System.out.println(maxValue);

更新如果你还想有索引,用2个循环比较合适。

int maxValue = Integer.MIN_VALUE;
int indexMaxValueArray = 0;

for (int i = 0; i < moves.size(); i++) {
    if (someValue * moves.get(i)[2] > maxValue) {
        maxValue = someValue * moves.get(i)[2];
        indexMaxValueArray = i;
    }
}
System.out.println("maxValue = " + maxValue);
System.out.println("index of array in list = " + indexMaxValueArray);

【讨论】:

  • 很好用,现在我得到了正确的值,但我怎样才能找到值的索引?返回值.indexOf(maxValue);没有找到正确的对象,因为它嵌套在数组中,或者?
  • 假设someValue 大于零,当你想要的只是最大值乘以someValue 时,将每个值与它相乘是没有意义的。只需先搜索最大值,然后再乘以,例如moves.stream().mapToInt(array -&gt; array[2]).max().get() * someValue
  • @Holger 我知道。让它更容易理解
【解决方案2】:

当你想使用 Stream 时,你可以这样做。

ArrayList<Integer> values = new ArrayList<>(Arrays.asList(new Integer[]{1,2,3}));
    int valueindex = values.indexOf(values.get(2));//to get the index
   // Integer v = values.get(2);
    Integer s = values.stream().reduce((a,b)-> b*2).get();//multiply lastvalue by 2
    System.out.println(s);
    System.out.println(valueindex);

但是当你想使用流来查找 maxValue 时,你可以使用它,它的工作原理是一样的:

Integer maxvalue = values.stream().reduce(0,Integer::max);

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2011-04-08
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多