Объединение двух списков, содержащих объекты - PullRequest
0 голосов
/ 27 июня 2018

У меня два списка

ListA<TestData> listA = new ArrayList<TestData>()
ListB<TestData> listB = new ArrayList<TestData>() 

оба содержат объект типа TestData, а TestData содержит эти переменные.

TestData {
    String status;
    String billType;
} 

Я хочу объединение двух списков.

ListA = ["ACTV","S"],["DISC","E"];

ListB = ["ACTV","V"],["DISC","E"],["DISC","S"];

UpdatedList = ["ACTV","S"],["DISC","E"],["ACTV","V"],["DISC","S"];

Я попытался, проверив приведенное ниже условие, но оно не работает.

for (TestData myData : ListA) {
        if(!ListB.contains(myData))
            return true;
    }

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

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Вы также можете использовать коллекции Apache Commons, если вы можете использовать внешнюю библиотеку

ListUtils.union(listA , listB);

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html#union(java.lang.Iterable,%20java.lang.Iterable)

0 голосов
/ 27 июня 2018

Вы можете использовать Set и позволить TestData переопределить equals и hashCode, чтобы избежать дублирования.

TestData {
   String status;
   String billType;

   public boolean equals(Object obj) { 
      if (obj == null || !(obj instanceof Testdata)) return false;
      TestData other = (TestData) obj;

      return status.equals(other.getStatus()) && billType.equals(other.getBillType())
   }

   public int hashCode() {
      int hashcode = 31;
      hashcode += 31 * status.length();
      hashcode += 31 * billType.length();
      return hashcode;
   }
}

, а затем

Set<TestData> data = new HashSet<>();
data.addAll(listA);
data.addAll(listB);

Если вы хотите отсортировать TreeSet, то вместо этого используйте Comparable, где вы сравниваете аналогично методу equals.

0 голосов
/ 27 июня 2018

Вы должны переопределить метод equals () для работы с методом contains () . https://docs.oracle.com/javase/7/docs/api/java/util/List.html#contains%28java.lang.Object%29

Вы можете переопределить метод equals () и hashCode () в своем классе, а затем поместить все списки в Set.

Set<TestData> uniqueElements = new HashSet<>();

uniqueElements.addAll(listA);
uniqueElements.addAll(listB);
0 голосов
/ 27 июня 2018

Вы можете использовать:

 ListA.addAll(ListB);

Это добавляет все элементы из коллекции B в A. Но List - это интерфейс, который допускает повторяющиеся значения.

Если вы хотите убедиться в отсутствии повторяющихся элементов, вы должны перезаписать метод equals в своем классе TestData и использовать наборы (например, HashSet) вместо списков.

Не по теме, в Java имена переменных начинаются со строчной буквы, см. Соглашения javacode: http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

...