2014-11-18 2 views
13

У меня есть два списка массивов, например.возвращающая разница между двумя списками в java

List<Date> a; 
contains : 10/10/2014, 10/11/2016 

List<Date> b; 
contains : 10/10/2016 

Как я могу сделать проверку между списком a и b поэтому значение, которое отсутствует в b возвращается? Например. 10/10/2014

+0

У guava есть некоторые инструменты для различий, но это для 'Set', я думаю, что' removeAll' может вам подойдет здесь –

+2

Скопируйте список 'a'. Удалите все элементы, которые отображаются в 'b' из копии. –

+1

https://docs.oracle.com/javase/7/docs/api/java/util/List.html#removeAll%28java.util.Collection%29 –

ответ

29

Вы можете конвертировать их в коллекцию Set и выполнять на них операцию set difference.

Как это:

Set<Date> ad = new HashSet<Date>(a); 
Set<Date> bd = new HashSet<Date>(b); 
ad.removeAll(bd); 
+18

'removeAll' возвращает' boolean' не 'Set' – Lukazoid

+1

Это верно, но когда вы смотрите на документацию, вы увидите, что это логическое сообщение сообщает, что это набор изменен в результате вызова ». После этого изменения вы можете заказать набор, и вы заметите, что он имеет ожидаемые результаты. – Daemun

15

Если вы хотите найти недостающие значения в Ь, вы можете сделать:

List toReturn = new ArrayList(a); 
toReturn.removeAll(b); 

return toReturn; 

Если вы хотите, чтобы узнать значения, которые присутствуют в любом списке, вы можете дважды выполнить верхний код. С измененными списками.

+0

Это должен был быть наилучший ответ –

+0

что, если его неумолимый список? – user1735921

+0

Поскольку вы создаете новый список, это работает также и для неизменяемого списка. –

1

Я искал другую проблему и наткнулся на это, поэтому добавлю свое решение к связанной проблеме: сравнивая два Maps.

// make a copy of the data 
    Map<String,String> a = new HashMap<String,String>(actual); 
    Map<String,String> e = new HashMap<String,String>(expected); 
    // check *every* expected value 
    for(Map.Entry<String, String> val : e.entrySet()){ 
     // check for presence 
     if(!a.containsKey(val.getKey())){ 
      System.out.println(String.format("Did not find expected value: %s", val.getKey())); 
     } 
     // check for equality 
     else{ 
      if(0 != a.get(val.getKey()).compareTo(val.getValue())){ 
       System.out.println(String.format("Value does not match expected: %s", val.getValue())); 
      } 
      // we have found the item, so remove it 
      // from future consideration. While it 
      // doesn't affect Java Maps, other types of sets 
      // may contain duplicates, this will flag those 
      // duplicates. 
      a.remove(val.getKey()); 
     } 
    } 
    // check to see that we did not receive extra values 
    for(Map.Entry<String,String> val : a.entrySet()){ 
     System.out.println(String.format("Found unexpected value: %s", val.getKey())); 
    } 

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

+0

вопрос о списке не карте, добавьте свое решение, чтобы задать вопрос ... – user1735921

+0

Мне не было известно о вопросе о картах. Если вы нашли вопрос о картах, не стесняйтесь ссылаться на этот ответ. –

2

Вы можете использовать CollectionUtils из Apache Commons Collections 4.0:

new ArrayList<>(CollectionUtils.subtract(a, b)) 
+0

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

0

Вы можете использовать фильтр Java 8 библиотеки поток

List<String> aList = Arrays.asList("l","e","t","'","s"); 
List<String> bList = Arrays.asList("g","o","e","s","t"); 

List<String> result = aList.stream().filter(aObject -> { 
    return bList.contains(aObject); 
}).collect(Collectors.toList()); 

System.out.println(result); 

Результат:

[e, t, s] 
Смежные вопросы