【问题标题】:how can I reduce my list of structures based on the other list of Strings in Java?如何根据 Java 中的其他字符串列表减少我的结构列表?
【发布时间】:2020-06-01 21:16:06
【问题描述】:

在我的Java 应用程序中,我有一个类:

public class MyStructure {

    SomeClass someClass;
    String[] fields;

    ...
}

现在,我有一个以上结构的列表:

List< MyStructure> structures = getStructures();

我还有一个字符串列表:

List<String> myList = getStrings();

我需要过滤第一个列表 (structures),使其仅包含元素,在其 fields 数组中包含 myList 上存在的任何字符串。

我想过写一个 for 循环,比如:

List<MyStructure> outcomeStructures = new ArrayList<>(); 

for (MyStructure mystructure : structures) {
    for (String temp : mystructure.getFields()) {
        if (myList.contains(temp) {
            outcomeStructures.add(mystructure);
        }
    }
}

但也许有更好的方法可以做到这一点?谢谢!

【问题讨论】:

  • 这不行吗?
  • 了解 Java 流功能。我相信这正是您想要的。

标签: java for-loop java-8 java-stream


【解决方案1】:

为了获得更好的性能,您可以将List&lt;String&gt; myList = getStrings(); 转换为Set&lt;String&gt; mySet,因为HashSet time complexity for contains 始终是O(1)。然后使用:

List<MyStructure> outcomeStructures = structures.stream()
        .filter(st -> Arrays.stream(st.getFields()).anyMatch(mySet::contains))
        .collect(Collectors.toList());

【讨论】:

  • 我觉得有问题,collect 函数在这里不可见,也许我应该调用它而不是 anyMatch 的结果,返回布尔值?
  • @randomuser1 您是否确保代码中的括号正确匹配?试试当前的代码,可以确认编译成功。
最近更新 更多