2016-09-07 3 views
0

Итак, у меня есть 2-й массив (действительно, список списков), который мне нужно прокрутить и удалить любые дубликаты, но только для определенного поля.Хэш-элементы в массиве 2d, но только по одному индексу

Основной макет - это список совпадений, каждый из которых имеет идентификационный номер и дату. Мне нужно удалить все дубликаты, чтобы каждый идентификатор отображался только один раз. Если идентификатор появляется несколько раз в списке совпадений, я хочу взять Матч с самой последней датой.

В моем текущем решении я взял список совпадений, добавив его в HashSet и преобразовывая его обратно в ArrayList. Однако все, что делает, это удалить любые точные совпадения совпадений, которые по-прежнему оставляют меня с одинаковым идентификатором, появляющимся несколько раз, если у них разные даты.

Set<Match> deDupedMatches = new HashSet<Match>(); 
deDupedMatches.addAll(originalListOfMatches); 
List<Match> finalList = new ArrayList<Match>(deDupedMatches) 

Если мои исходные данные, поступающие в есть

{(1, 1-1-1999),(1, 2-2-1999),(1, 1-1-1999),(2, 3-3-2000)}

то, что я вернусь есть

{(1, 1-1-1999),(1, 2-2-1999),(2, 3-3-2000)}

Но то, что я действительно ищет решение, которое бы дайте мне

{(1, 2-2-1999),(2, 3-3-2000)}

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

+0

, как мы должны помочь без кода .. – Javant

+1

Так что, если я понимаю этот вопрос правильно вам дается 2-мерный массив объектов Match. Вы хотите сжать это в список, где нет дубликатов? Не можете ли вы использовать словарь и перебрать в 2-D список и проверить, существует ли ключ (ID в этом случае) и если да, то сравнить даты? Может быть, я не очень хорошо понимаю этот вопрос. –

+0

@MichaelPlatt У вас есть идея правильно, и я тоже рассматриваю этот вариант. Мне было интересно узнать, есть ли более эффективный/эффективный способ, кроме как просто перебирать все элементы и проверять каждое столкновение. –

ответ

1

Если я правильно понял ваш вопрос, вы хотите получить отдельные идентификаторы из списка с последней датой, с которой оно происходит.

Потому что ваш Матч - это класс, который не так легко сравнивать друг с другом из-за полей, на которые не смотрит Set.

Что бы я сделал, чтобы обойти эту проблему, используйте HashMap, который позволяет связать различные ключи и значения. Ключи не могут быть повторены, значения могут.
Я хотел бы сделать что-то подобное в то время как цикл через:

if(map.putIfAbsent(match.getID(), match) != null &&  
    map.get(match.getID()).getDate() < match.getDate()){ 
    map.replace(match.getID(),match); 
} 
  • Так что, что делает это перебирает ваши матчи.
  • Поместите текущее совпадение с его идентификатором, если этот идентификатор еще не существует.
  • .putIfAbsent возвращает старое значение, которое равно null, если оно не существует.
  • Затем вы проверяете, был ли предмет на карте с этим идентификатором, используя putIfAbsent (2 птицы одним камнем).
  • После этого можно с уверенностью сравнить две даты (одна на карте и одна с итерации - < - это экзамены для вашего метода сравнения)
  • , если новый позже заменен текущим совпадением.
  • И, наконец, чтобы получить список, который вы используете.getValues ​​()

Это позволит удалить повторяющиеся идентификаторы и оставить только последние.

Извинения за опечатки или ошибки кода, это было сделано на телефоне. Пожалуйста, сообщите мне о каких-либо ошибках в комментариях.

Java 7 не имеют функции .putIfAbsent и .Привернуть, но они могут быть для .Contains замещенные и .Put

+0

Мне нужно было внести некоторые изменения в ваш код, но только потому, что я использую Java 7 вместо 8, у которого нет ' map.putIfAbsent() 'или' map.replace() '. Мне также нужно было использовать 'date.before()' вместо оператора <. Но все это было очень полезно. –

+0

@ D.Spetz. Ах ладно, хорошо, что это не большая проблема, и я выбрал the.answer соответственно. Что касается> это просто псевдо для вашего метода сравнения –