繁体   English   中英

Java Stream:比较一个列表是否等于第二个列表的开始(不比较整个列表)

[英]Java Stream: Comparing if one list is equal to START of second list (not comparing whole list)

我在 Java 中有两个列表,例如list1 = (A,B,C) , list2 = (A,B,C,D)我希望将这些列表进行比较,因为 list1 等于 list2 的 START。

我有这个没有流的代码:

List<LetterForAnalysis> textList = LetterHelper
        .findNikudLetterForAnalysisList(text);

List<LetterForAnalysis> expressionList = LetterHelper
        .findNikudLetterForAnalysisList(expression.getHebrew());

if (textList.size() > expressionList.size()) {
    return false;
}
for (int i = 0; i < textList.size(); i++) {
    if (!LetterForAnalysis.isEqual(textList.get(i),
            expressionList.get(i))) {
        return false;
    }
}
return true;

是否可以使用 Java 流来做到这一点? 如果是这样,怎么办? 我正在尝试学习如何使用流,这真的很困难。 先感谢您。

您可以在列表 A 和allMatch的索引上使用 IntStream 到 stream 来检查每个索引的条件是否为真。 如果谓词在 stream 中早期返回 false,这将导致短路。

if (a.size() > b.size()) {
    return false;
}
final IntStream indices = IntStream.range(0, a.size());
return indices.allMatch((i) -> a.get(i).equals(b.get(i)));

你可以这样尝试:

List<String> list1 = new ArrayList<>(Arrays.asList("1","2", "3", "4"));
List<String> list2 = new ArrayList<>(Arrays.asList("1", "2", "3"));

boolean result = Collections.indexOfSubList(list1, list2) == 0;

Collections.indexOfSubList(list1, list2)将返回一个索引,子列表从这里开始。

我不认为流将是您的问题的适当解决方案。 流应该被终止,一旦发现字符不匹配,您就会希望终止 stream。

请注意,您发布的解决方案有一个错误,因为您的 for 循环变量被初始化为 1,而不是 0。

public boolean startsWith(List<LetterForAnalysis> needles, List<LetterForAnalysis> haystack) {
    if (needles.size() > haystack.size())
      return false;
    Iterator<LetterForAnalysis> needlesIter = needles.iterator();
    Iterator<LetterForAnalysis> haystackIter = haystack.iterator();
    while (needlesIter.hasNext()) {
      if (!haystackIter.hasNext() 
          || !LetterForAnalysis.isEqual(hayStackIter.next(), needlesIter.next())
        return false;
    }
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM