检查列表是否包含相同的对象

时间:2017-01-05 13:58:11

标签: java arrays list

我有两个填充列表。 第一个列表包含例如:

"Shoppinglist-fruit", "Shoppinglist-drinks", "Shoppinglist-dinner"

第二个清单包含:

"Shoppinglist-drinks"

现在我想打印第一个列表中的所有项目,除非第二个列表中的同一个对象具有相同的名称(Shoppinglist-drinks)。 看起来像:  "Shoppinglist-fruit", "Shoppinglist-dinner"

那么如何检查第二个列表中对象的名称是否也在第一个列表的一个对象中。 最终我想得到一个字符串,其中包含第一个列表中的所有商品名称,而不是第二个列表中的商品列表。 我从下面的一些代码开始,但我还没能完成它。

我有两个列表,一个名为listShoppinglists,这是一个填充不同购物清单的列表。 第二个清单上填满了某人的购物清单。 所以我想检查一下购物清单的名称是否相同。 如果这样做的话。

public String getAllShoppingLists(List listShoppinglists, Customer customer, List shoppinglists) { 
String namesOfTheShoppingListNames = ""
for (Shoppinglist shoppinglist : listShoppinglists) {
       for (int i = 0; i < customer.shoppinglists.size(); i++) {
           if (customer.shoppinglists.get(i).getName().equals(shoppinglist.getName())) { 
    // Some action here    
           } 
       }    
    } 
return namesOfTheShoppingListNames;
}

2 个答案:

答案 0 :(得分:2)

你可以试试这个:

    List<ShoopingList> firstShoppingListNames = new ArrayList<>();
    firstShoppingListNames.add(new ShoppingList("fruit"));
    firstShoppingListNames.add(new ShoppingList("dinner"));
    firstShoppingListNames.add(new ShoppingList("juice"));
    List<ShoppingList> secondShoppingListNames = new ArrayList<>();
    secondShoppingListNames.add(new ShoppingList("fruit"));


    List<ShoppingList> distinct = firstShoppingListNames.stream().
            filter( list -> secondShoppingListNames.stream().
            noneMatch(o -> o.getName().equals(list.getName()))).
            collect(Collectors.toList());

    distinct.forEach(o -> System.out.print(o.getName()));

在这种情况下,您正在使用流来实现您想要的效果。您筛选第一个列表以获取其他列表中不存在的那些元素。

另外,如果您只想获取这些列表的名称,可以使用map:

    List<String> distinct = firstShoppingListNames.stream().
             filter( list -> secondShoppingListNames.stream().
             noneMatch(o -> o.getName().equals(list.getName()))).
             map(ShoppingList::getName).collect(Collectors.toList());

答案 1 :(得分:1)

使用Collections.removeAll()方法执行此操作。引自JavaDoc: -

  

删除包含在其中的所有此集合的元素   指定的集合(可选操作)。这个电话之后   返回时,此集合将不包含与其共同的元素   指定的集合

.List<String> list1=new ArrayList<String>();
        list1.add("Shoppinglist-fruit");list1.add("Shoppinglist-drinks");list1.add("Shoppinglist-dinner");
        List<String> list2=new ArrayList<String>();
        list2.add("Shoppinglist-drinks");
        list1.removeAll(list2);
        System.out.println(list1);

//Output:- [Shoppinglist-fruit, Shoppinglist-dinner]

如果列表包含自定义对象,则覆盖该自定义对象中的equals和hashcode方法