Сравнить большие списки и извлечь недостающие данные - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть два очень больших ArrayList, каждый из которых содержит миллионы данных.Я хочу отфильтровать данные из List1, которого нет в List2 и / или наоборот.

Я пробовал Apache CollectionUtils, потоковый API Java 8, но безуспешно.

Параллельная потоковая передача Java 8 потребляет весь ЦП, а CollectionUtils продолжает сравнивать набор данных без вывода.

Пример POJO

public DataVO {
 private String id;
 private String value;
 ...
 // getters / setters

 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = (prime * result) + ((id == null) ? 0 : id.hashCode());
  return result;
 }

 @Override
 public boolean equals(final Object obj) {
  ...
  ...
  final DataVO other = (DataVO) obj;
  if (id == null) {
   if (other.id != null) {
    return false;
   }
  }
  else if (!id.equals(other.id)) {
   return false;
  }
  return true;
 }
}

hashCode() / equals () может иметь больше полей, так как сейчас я сохранил это просто.

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

Пожалуйста, дайте мне знать, если у вас есть какие-либо указатели.

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете прочитать большие куски ArrayList в HashSet, скажем, по 10 тыс. Элементов.Убедитесь, что вы установили размер в конструкторе HashSet.Затем для каждого чанка звоните HashSet#RemoveAll с другим ArrayList.Остальные записи - ваш ответ.Может даже распараллелить с ThreadPoolExecutor.

List missing = new ArrayList(); // answer

for (int i = 0; i < list1.size(); ) {
    int offset = i;
    i += 16 * 1024;
    if (i > list1.size()) i = list1.size();
    Set chunk = new HashSet(list1.subList(offset, i));

    for (int j = list2.size(); --j >= 0; chunk.remove(list2.get(j));
    missing.addAll(chunk);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...