2017-01-05 3 views
0

У меня есть два заполненных списка. Первый список содержит, например:Проверьте, содержат ли списки одни и те же объекты

"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; 
} 
+0

Вы, кажется, приравнивая элементов списка с одним свойством (имя) этих элементов. Этому не помогает тот факт, что вы используете необработанные типы. И в любом случае неясно, о чем вы на самом деле спрашиваете. –

ответ

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] 

В случае, списки содержит пользовательские объекты, переопределение равно и методы Hashcode в этом специальном объекте.

+0

Я считаю, что переопределение равных для одного случая, который здесь является именем списка покупок, не является хорошим подходом. В таких случаях нам нужно думать о будущих проблемах, которые могут вызвать простые равные. –

+0

@KamilBanaszczyk, если список содержит пользовательские объекты, то ваше решение в любое время более чистое, чем я предложил. Но если они просто содержат строки, removeAll более чем достаточно. –

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())); 

В этом случае вы используете поток для достижения того, что вы хотите. Вы фильтруете первый список для получения тех элементов, которых нет в другом списке.

Additionaly, если вы хотите получить только имена этих списков вы можете использовать карту:

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

Вы можете нарезать этот вызов, чтобы сделать его более читаемым. –

Смежные вопросы