2017-11-16 3 views
1

Java의 ArrayList에서 어떻게 더티 체크를 수행 할 수 있습니까? 두 번째 목록에서Java : ArrayList가 더러운 지 확인 하시겠습니까?

[0][lion,Carnivorous,Africa] 
[1][tiger,Carnivorous,Zambia] 
[2][Goat,Herbivorous,Zimbabwe] 

: I의 값이

List<Animal> animalList1 = new ArrayList<Animal>(); 
List<Animal> animalList2 = new ArrayList<Animal>(); 
제 목록에서

, :

가 나는 두 개의리스트가 물체

Animal 
{ 
    String animalName; 
    String animalType; 
    String animalPlace 
} 

을 값은 다음과 같습니다.

색인 (2) 상기 제 2리스트에서
[0][lion,Carnivorous,Africa] 
[1][tiger,Carnivorous,Zambia] 
[2][Goat,Herbivorous,Norway] 

10 요소의 animalPlace 노르웨이 짐바브웨에서 변화했다. 두 목록 값과 변경된 값을 비교하여 해당 개체를 별도의 목록에 넣으려면 어떻게해야합니까?

for (int i = 0; i < list1.size(); i++) 
{ 
    for (int j = i+1; j < list2.size(); j++) 
    { 
    // compare list1 and list2 values 
    } 
} 

이 빨리 및/또는 더 나은 방법이 있나요 :

List<Animal> animalList3 = new ArrayList<Animal>(); 

[0] [Goat,Herbivorous,Norway] 

나는 for 루프 사용하여 목록을 비교하여 그 일의 전통적인 방법을 알아?

+1

'equals()'메서드를 구현하고 유일한 것들을 유지하십시오. – azro

+2

음, list1 [i]와 list2 [i]를 비교하고 싶습니다. 그것은 당신의 중첩 루프가하는 것이 아닙니다. 그것을 올바르게하는 것이 이미 훨씬 빠를 것입니다. 올바른 해결책을 찾아서 시작하십시오. 그다지 빠르지 않으면 최적화하십시오. @ azro가 말한대로 –

+0

은 equals를 구현합니다. 다음을 사용할 수 있습니다 : list1.stream(). filter (a -> list2.stream() anyMatch (a2 -> a2.equals (a))). – Lino

답변

5

List#removeAll() 방법은 친구입니다.

다음 equals() 구현하고 동물에 대한 hashCode() 및 :

List<Animal> animalList3 = new ArrayList<Animal>(animalList2); 
animalList3.removeAll(animalList1); 
+0

@azro'animalList2'에서 업데이트 된 동물은'animalList1'에서 동물을'equals()'해서는 안됩니다.'removeAll()' 새로 생성 된 'animalList3'에서 업데이트 된 동물을 제거하지 않습니다. 따라서,'animalList3'는 **와 ** 수정 된 모든 새로운 항목을 포함합니다. OP는 새로운 엔트리의 존재 여부와 출현 여부에 대해서는 명시하지 않았다. 마찬가지로 OP는 항목이 삭제 된 경우 수행 할 작업을 지정하지 않았습니다. 그러나 목록의 항목 만 수정하면 모든 수정 된 항목이'animalList3'에 표시됩니다. – AJNeufeld

2

당신이이 방법을 수행 할 수 있습니다 두 번째 목록을 반복하고 처음 list하지만 어떤 하지 만 사람을 유지 같음 :이 수정 된

( type 또는 placename은 동일) 91,

으로 :

List<Animal> animalList1 = new ArrayList<Animal>(); 
animalList1.add(new Animal("lion", "Carnivorous", "Africa")); 
animalList1.add(new Animal("tiger", "Carnivorous", "Zambia")); 
animalList1.add(new Animal("Goat", "Herbivorous", "Zimbabwe")); 
animalList1.add(new Animal("Donkey", "Herbivorous", "Zimbabwe")); 

List<Animal> animalList2 = new ArrayList<Animal>(); 
animalList2.add(new Animal("lion", "Carnivorous", "Africa")); //not new but no modif X 
animalList2.add(new Animal("tiger", "Carnivorous", "Zambia")); //not new but no modif X 
animalList2.add(new Animal("Goat", "Herbivorous", "Norway")); //not new and modif  V 
animalList2.add(new Animal("Horse", "Herbivorous", "Norway")); //new     X 

당신은 끝에 만 [Goat,Herbivorous,Norway], 두 번째


에 첫 번째 목록에서 업데이트되는 하나를 얻을 수 있습니다 그리고 당신은 equals() 필요 이렇게 :

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 
    Animal animal = (Animal) o; 
    return animalName.equals(animal.animalName) && animalType.equals(animal.animalType) && animalPlace.equals(animal.animalPlace); 
} 
+0

새로운 개체 또는 개체의 속성 만 비교할 수 있습니까? – sTg

+0

둘 다 ** 목록에는 있지만 둘 다 같지 않은 것만 인쇄하십시오. 따라서 업데이트 된 키는 – azro

+0

입니다. 'animalName'은 고유 키라고 가정합니다. 두리스트 모두에 [염소, 초식 동물, 짐바브웨]와 [염소, 초식 동물, 노르웨이]가 포함되어 있으면 두 항목 모두'anyMatch' 필터 (그 이름의 평등하지 않은 동물이 있음)를 전달합니다. 수정 사항이 없더라도 수정 된 목록 – AJNeufeld