【问题标题】:Java Stream: Comparing if one list is equal to START of second list (not comparing whole list)Java Stream:比较一个列表是否等于第二个列表的开始(不比较整个列表)
【发布时间】:2021-06-12 12:53:13
【问题描述】:

我在 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 流来做到这一点吗?如果是这样,怎么办?我正在尝试学习如何使用流,这真的很困难。提前谢谢你。

【问题讨论】:

  • return textList.equals(expressionList.subList(0, textList.size()); 或类似的:可能会差一个。不需要循环或流。

标签: java java-stream


【解决方案1】:

您可以使用 IntStream 对列表 A 和 allMatch 的索引进行流式传输,以检查每个索引的条件是否为真。如果谓词在流的早期返回 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)));

【讨论】:

    【解决方案2】:

    你可以这样试试:

    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) 将返回一个索引,子列表从这里开始。

    【讨论】:

      【解决方案3】:

      我认为流不适合解决您的问题。流是要终止的,一旦发现字符不匹配,您会希望终止流。

      请注意,您发布的解决方案有一个错误,因为您的 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;
      }
      

      【讨论】:

      • 感谢您对错误的提示。
      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多