首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时迭代2个列表

同时迭代2个列表
EN

Stack Overflow用户
提问于 2021-01-08 05:52:12
回答 4查看 194关注 0票数 1

我正在尝试将下面的代码转换为Java 8(使用streams),但不确定如何使用streams同时迭代通过2个列表。

代码语言:javascript
复制
public class ComparisonString {
    private static List<String> input;

    public static void main(String[] args) {
        input = Arrays.asList("TRUE","FALSE","TRUE","N/A");
        ComparisonString cs = new ComparisonString();
        System.out.println(cs.getMatchedOutput(Arrays.asList("TRUE","N/A","N/A","FALSE")));

    }
    /**
     * Check whether the 'input' List and the 'givenInput' List match.
     * If a value is "N/A" in either lists then it means does-not-matter/don't-check-for-a-match-and-go-next
     * @param givenInput
     * @return
     */
    public Optional<String> getMatchedOutput(final List<String> givenInput) {
        boolean flag = true;
        for (int i = 0; i < givenInput.size(); i++) {
            if (this.input.get(i) != null
                    && !(this.input.get(i).equalsIgnoreCase("N/A")
                    || givenInput.get(i).equalsIgnoreCase("N/A"))
                    && !this.input.get(i).equalsIgnoreCase(givenInput.get(i))) {
                flag = false;
                break;
            }
        }
        if (flag) {
            return Optional.of("flag = true");
        } else {
            return Optional.empty();
        }
    }
}
EN

回答 4

Stack Overflow用户

发布于 2021-01-08 06:35:29

可以使用IntStream为两个列表生成索引流,然后过滤掉不相关的列表值并匹配剩余的值:

代码语言:javascript
复制
public Optional<String> getMatchedOutput(final List<String> givenInput) {
    return IntStream.range(0, givenInput.size())
             .filter(i -> null != input.get(i) && null != givenInput.get(i))
             .filter(i -> !"N/A".equalsIgnoreCase(input.get(i)) && !"N/A".equalsIgnoreCase(givenInput.get(i)))
             .allMatch(i -> input.get(i).equalsIgnoreCase(givenInput.get(i)))
        ? Optional.of("flag = true")
        : Optional.empty();
}

对已知数据进行测试:

代码语言:javascript
复制
input = Arrays.asList("TRUE","FALSE","TRUE","N/A");
ComparisonString cs = new ComparisonString();
 System.out.println(cs.getMatchedOutput(Arrays.asList("TRUE","N/A","N/A","FALSE")));

打印:

代码语言:javascript
复制
Optional[flag = true]
票数 1
EN

Stack Overflow用户

发布于 2021-01-08 08:02:42

你做这件事的方式并没有错,streams在这方面做得太过分了,而且效率可能会更低。不过,我会提出两点建议:

  • 不需要布尔值。在比较失败后立即执行return Optional.empty()。否则,在for循环后返回return Optional.of("flag = true")
  • 您应该检查List大小是否不相等。如果您为循环选择较长的一个,它可能会抛出异常。您可以采用两种大小的Math.min,忽略比较中的额外元素,或者只检查列表大小是否相等,并确定这对于应用程序的列表相等意味着什么。
票数 1
EN

Stack Overflow用户

发布于 2021-01-08 06:33:28

不幸的是,你不能使用一个流同时操作两个列表。你能做的就是使用迭代器。我试着写了一些代码,它应该是这样的:

代码语言:javascript
复制
public static void streamTest(List<String> givenList) {
    List<String> testing = new ArrayList<>();
    IntStream.range(0, givenList.size())
            .parallel()
            .forEach(i -> {
                if (input.get(i) != null
                        && !(input.get(i).equalsIgnoreCase("N/A")
                        || givenList.get(i).equalsIgnoreCase("N/A"))
                        && !input.get(i).equalsIgnoreCase(givenList.get(i)))
                    testing.add("false");
            });
    if (testing.isEmpty())
        System.out.println("flag = true");
    else
        System.out.println("flag = false");
}

我希望这对你有所帮助,并给你一个开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65620462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档