Эффективное сравнение проверки карт внутри списка объектов в Java - PullRequest
1 голос
/ 19 сентября 2019

Итак, у меня есть объект, в котором есть хэш-карта (конечно, с соответствующими методами получения и установки).

public class ObjA {
   private HashMap<String, Boolean> mymap;
   ...
}

Затем у меня есть другой класс со списком этих объектов (и соответствующие методы получения / установки):

public class ObjB {
   private List<ObjA> list;
   ...
}

Затем третий класс CheckerClass должен проверить, сколько ObjA в списке внутри ObjB имеют одинаковую карту (это означает, что одни и те же ключи и одинаковыезначения для каждого ключа).

Моя первоначальная мысль заключалась в следующем: зациклите list, и для каждого ObjA разберите свою карту на String.Соберите все разборы на Collection, а затем посчитайте дубликаты.Но я хочу что-то более эффективное использование памяти и более элегантное: вы знаете, легко читается.И я не уверен, как его получить.

Ответы [ 2 ]

5 голосов
/ 19 сентября 2019

Вот способ создания счетчика каждой уникальной карты:

list.stream().collect(Collectors.groupingBy(ObjA::getMyMap, Collectors.counting());

Это работает, потому что Map.equals делает именно то, что вы хотите: проверяет, совпадают ли наборы ключей и сопоставляются ли они с равными значениями.

Итак, для каждой уникальной карты вы можете найти, сколько раз она появляется в списке.Или, если вы хотите узнать, сколько дубликатов, используйте .values().stream().filter(c -> c > 1).count() на полученной карте.

0 голосов
/ 19 сентября 2019

Мое мнение состоит в том, чтобы изменить ObjA как сопоставимый объект.Вы можете сделать так:

public class ObjA implements Comparable<ObjA>{
   private HashMap<String, Boolean> mymap;
   ...
  @Override
  public int compareTo(ObjA o) {
   //overide it by comparing key and value.
  }
}

В CheckerClass.Вы можете сортировать список ObjA и подсчитывать дублирующиеся объекты.

Collections.sort(list)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...