当前位置: 首页 > 知识库问答 >
问题:

如何在具有匹配属性[重复]的列表中查找元素的索引

公羊向荣
2023-03-14

我有一个对象列表

class B {
    int x;
    String y;
}

现在我想找到B对象B的最后一个匹配项,使得B.x=1。我可以通过简单地运行for循环并更新每个匹配的索引来实现这一点。但在Java 8中如何做到这一点,我还不清楚。

我看到有Java 8 API用于查找findFirst()和findAny(),但没有找到任何类似于查找最后一个事件的API。

共有3个答案

竺国兴
2023-03-14

就像基于循环的搜索一样,当您寻找最后出现的东西时,最有效的解决方案是向后搜索。此外,如果您需要使用Stream API查找索引,您必须首先流式传输索引:

OptionalInt pos = IntStream.rangeClosed(1-list.size(), 0).map(i -> -i)
    .filter(ix -> list.get(ix).x == 1)
    .findFirst();

pos.ifPresent(ix -> System.out.println("found "+list.get(ix)+" at "+ix));
通奕
2023-03-14

使用duce操作可以实现它,您首先保留匹配的元素,然后对于每对(有序)保留第二个,直到剩下一个并返回它

static B getLastBeFromInt(List<B> list, int i){
    return list.stream().filter(b -> b.x==i).reduce((first,second) -> second).orElse(null);
}
  • 可行的演示
  • 更多参考
凌智
2023-03-14
 Optional<B> reduce = list.stream()
            .filter(b -> b.x == 1)
            .reduce((a, b) -> b);

这将采用相同的对象(具有相同的值x)并返回列表中的下一个对象。

 类似资料:
  • 问题内容: 我有一个很长的浮点数列表,范围从1到5,称为“平均值”,我想返回小于a或大于b的元素的索引列表 但是令人惊讶的是,“ matches”的输出中有很多重复,例如。 为什么会这样呢? 问题答案: 您正在使用它将仅在列表中找到您的值的 第一个 匹配项。因此,如果在索引2和索引9处的值为1.0,则无论列表中发生了多少次,都将 始终 返回。 使用到索引添加到您的循环,而不是: 您可以将其折叠为列

  • 问题内容: 我是AngularJS的新手。我了解到可以使用以下查询在DOM中找到元素: 这对于按ID或CSS类名查找元素很有用。但是,我需要能够使用其他方法来查找元素。我有一个看起来像下面的元素: 我无法查询“ myContainer”,因为它已被重用了多少。因此,我想找到任何具有“ my- directive”属性的元素。如何搜索DOM并找到任何使用“我的指令”的元素? 问题答案: 您应该在指令

  • 我是8Java的新手。我有一个A类对象的列表,其中A的结构如下: 现在我有了一个类A的元素L的列表,在这个列表中,我想用inactive=false更新一个名为name="test "的元素。 我可以通过编写for循环并创建一个新列表来非常轻松地做到这一点。 但是我如何使用Java8流API呢?

  • 问题内容: 只会给出列表中第一个出现的项目。有没有整齐的技巧可以返回列表中的所有索引? 问题答案: 你可以使用列表理解:

  • 我有一个对象列表,我想找到一个具有特定属性值的元素的索引。 例如 我知道用for循环写一个很容易,但是有没有任何现有的简单方法来做到这一点,比如流或任何库Util?

  • 我试图找到一个没有属性的元素的XPath。它只能通过其父级的属性来识别。然而,父级也不具有唯一属性。 例如: 这里有两个元素。如何获得第二个元素。上面的语法为我提供了第一个元素。。但是,如果我使用: 我得到一个错误消息"xpath表达式 '//*[@id="btn"][2]/ul/li[2]/a/span'无法计算或不会导致WebElement"