2013-09-04 2 views
0

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

Map<String, List<Stations>> overview = new TreeMap<String, List<Stations>>(); 
    for(Trains train: trainOverview){ 
     List<Stations> mapValue = overview.get(train.getTrainNumber()); 
     //Merge lists if the key already exists, and replace the old value with the merged list 
     if(overview.containsKey(train.getTrainNumber())){   
      for(Stations station: train.getStations()){ 
       if(!mapValue.contains(station)) mapValue.add(station); 
      } 
      overview.put(train.getTrainNumber(), mapValue); 
     } 
     //If no key exists, create a new entry 
     else{ 
      overview.put(train.getTrainNumber(), train.getStations()); 
     } 
    } 
+0

Что такое "trainOverview"? Над картой вы можете перебирать с помощью Entry : http://stackoverflow.com/questions/46898/how-do-i-iterate-over-each-entry-in-a-map – arjacsoh

ответ

3

Уникальность элементов в коллекции может быть достигнуто с использованием Set реализации. Вы должны использовать его. Сначала перебираем элемент вашего первого списка и добавляем его в набор. Затем повторите ту же процедуру для второго списка. Готово.

1

Для того, чтобы contains вернуть true, equals должен быть переписан в вашем Station классе, чтобы сделать проверку правильно, в противном случае вызов идет к Object «s реализации, сравнивающих по ссылке.

Если вы хотите продолжать использовать List s, проверьте свою реализацию equals. Если у вас не более одной станции на каждой записи карты overview, я предлагаю вам перейти на Set, который по умолчанию обрабатывает уникальность объекта. Вам все равно придется предоставить действительную версию для equals жесткой.

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