【问题标题】:Find the first time that value in a list surpass a value in another list查找列表中的值第一次超过另一个列表中的值
【发布时间】:2017-03-23 14:38:45
【问题描述】:

我有两个列表,我想在第二个列表开始具有比第一个列表更高的值时找到索引。 例如:

列表 A:[6、9、15、17、18、20]

列表 B:[5、8、14、16、19、22]

列表 B 的值高于列表 A 中相同索引的值的索引是 4。

我尝试使用zip,然后findFirst,但我不知道如何获取索引而不是元素。

 Streams.zip(listA, listB, Pair::of)
.findFirst(pair-> pair.getFirst() < pair.getSecond());

有没有使用 Java 8 的好方法?

【问题讨论】:

  • surpass 你的意思是它总是更高?
  • 如果不存在这样的索引应该返回什么?
  • 如果您认为循环遍历两者并比较相对定位的值很好,那么是的
  • 此外,在 StackOverflow 中,我们希望发布者能够解释他搜索和完成的内容。通常不接受“请帮我做”类型的问题。
  • 嗯所以定义可能不准确。我的意思是第一次发现列表 B 的值高于列表 A。

标签: java java-8 java-stream


【解决方案1】:

当然你可以使用流。 :-) 回到索引的解决方案是使用IntStream.range():

     OptionalInt first = IntStream.range(0, Math.min(listA.size(), listB.size()))
            .filter(i -> listB.get(i) > listA.get(i))
            .findFirst();
     System.out.println(first);

打印出来:

OptionalInt[4]

在实际使用中,您可能会以某种方式使用OptionalInt,例如它的ifPresentorElse 方法。

【讨论】:

  • 刚刚发布了相同的答案! :) 谢谢!
  • 是的,时机成熟
【解决方案2】:

我想我找到了办法:

IntStream.range(0, Min(listA.size, listB.size))
     .filter(i -> listA.get(i) < listB.get(i))
     .findFirst()
     .orElse(-1)

【讨论】:

    【解决方案3】:

    你可以试试这样的:

    private static int getIndex(List<Integer> first, List<Integer> second) {
        int result = -1;
        for (int i = 0; i < Math.min(first.size(), second.size()); ++i) {
            if (second.get(i) > first.get(i)) {
                result = i;
                break;
            }
        }
        return result;
    }
    

    【讨论】:

    • 谢谢 :) 我希望有类似 skipWhile 之类的东西,有条件到流。
    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2022-07-30
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多