[英]How to check if an ArrayList of Strings contains substrings of another ArrayList of Strings?
[英]Check if an arraylist contains two strings
我有一個像下面這樣的 pojo 課程
public CategoryModel {
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
我創建了一個數組列表,如下所示。
List<CategoryModel> variantCategoryModelList = new ArrayList<>();
CategoryModel cat1= new CategoryModel();
cat1.setName(TEST1);
CategoryModel cat2= new CategoryModel();
cat2.setName(TEST1);
list.add(cat1);
list.add(cat2);
我必須檢查,如果列表中存在值“TEST1”和“TEST2”,如果兩個值都存在於“列表”中,則返回“真”,我嘗試了類似下面的方法,盡管我的“列表”同時具有值,它返回false。你能幫我檢查一下我做錯了什么順便說一句我使用的是JDK 11。
final Optional<CategoryModel> optionalData = variantCategoryModelList.stream().
filter(valueData -> TEST1.equalsIgnoreCase(valueData.getName())
&& TEST2.equalsIgnoreCase(valueData.getName())).findFirst();
if(optionalData.isPresent()){
return true;
}
您可以將CategoryModel
映射到 name 並收集到字符串列表並調用List.containsAll
:
return variantCategoryModelList.stream()
.map(CategoryModel::getName)
.collect(Collectors.toList())
.containsAll(Arrays.asList("TEST1","TEST2"));
Set 將是一個更自然(更快)的數據結構:
return variantCategoryModelList.stream()
.map(CategoryModel::getName)
.collect(Collectors.toSet())
.containsAll(Set.of("TEST1", "TEST2"));
你的問題是and ( &&
) 而不是or 。
所以:
Set<String> soughtNames = Set.of("TEST1", "TEST2");
return variantCategoryModelList.stream()
.filter(cm -> soughtNames.contains(cm.getName()))
.distinct()
.count() == 2L;
正如@fps 所評論的,列表中需要distinct()
以防止 ["Test1", "Test1"] 被接受,或 ["Test1", "Test1", "Test2"] 失敗。
這顯然是低效的,因為它會 - 找到 2 個條目 - 仍然走到最后。
你要:
Set<String> soughtNames = Set.of("TEST1", "TEST2");
return soughtNames.stream()
.allMatch(soughtName ->
variantCategoryModelList.stream()
.anyMatch(cm -> soughtName.equals(cm.getName()));
或者有點復古風格:
return
variantCategoryModelList.stream()
.anyMatch(cm -> "TEST1".equals(cm.getName())) &&
variantCategoryModelList.stream()
.anyMatch(cm -> "TEST2".equals(cm.getName()));
這是一種方法:
Set<String> set = Set.of("TEST1", "TEST2");
boolean result = list.stream()
.filter(cat -> set.contains(cat.getName().toUpperCase())
.distinct()
.limit(2)
.count() == 2L;
這會流式傳輸類別列表,然后僅保留名稱為TEST1
或TEST2
類別。 然后我們刪除重復項並在找到兩個(已經不同的)類別名稱后停止。 這確保了短路。 最后,我們檢查最后是否正好有兩個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.