[英]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.