2017-12-27 21 views
-5

두 개의 객체 배열을 사용하여 중복 객체를 제거하고 있습니다. 두 개의 객체 배열을 비교하여 중복 객체를 제거하는 방법은 무엇입니까?

list1.add(new Class1("name1","number1")); 
list1.add(new Class1("name2","number2")); 
list1.add(new Class1("name3","number3")); 
list1.add(new Class1("name4","number4")); 

list2.add(new Class1("name1","number1")); 
list2.add(new Class1("name5","number2")); 
list2.add(new Class1("name6","number3")); 
list2.add(new Class1("name2","number4")); 

가 지금은 이름을 기준으로 목록 1 및 목록 2를 비교하려면 :

는 내가 아래와 같은 객체를 추가 Class1.java

String name; 
String number; 

의 배열 1 있습니다. 자신의에서 모든 필드 (고유 한 값)을 선택,

HashMap 가게 고유 키 : 어떻게 2

+2

HashSet을 사용해 보셨습니까? –

+0

나는 단 하나 arraylist와 시도했다. – basha

+0

목록 2에있는 목록 1의 요소를 제거 하시겠습니까? –

답변

0

단일 목록에 두 목록을 결합하고 사용자 정의 기능 아래에 보낼 목록과 비교 한 후 목록 1에서 중복 요소를 제거 할 수 있습니다 그 필드 값을 HashMap에 키로 설정하고 클래스 객체를 value로 설정합니다.

private List<Class1> clearListFromDuplicateFirstName(List<Class1> combineList) { 

    Map<String, Class1> cleanMap = new LinkedHashMap<String, Class1>(); 
    for (int i = 0; i < combineList.size(); i++) { 
      cleanMap.put(combineList.get(i).getname(), combineList.get(i)); 
    } 

    return new ArrayList<Class1>(cleanMap.values());; 
} 
+0

이 (가) 당신을 업데이트하고 업데이트 할 것입니다. – basha

2

당신은 removeAll 방법을 사용하여 list2에 존재 list1에서 요소를 제거 할 수 있습니다.

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (!(o instanceof Class1)) return false; 

    Class1 class1 = (Class1) o; 

    return name.equals(class1.name); 
} 

@Override 
public int hashCode() { 
    return name.hashCode(); 
} 

그런 요소를 추가 한 후, 바로 다음과 같은 방법 removeAll을 사용합니다 :

list1.add(new Class1("name1","number1")); 
list1.add(new Class1("name2","number2")); 
list1.add(new Class1("name3","number3")); 
list1.add(new Class1("name4","number4")); 

list2.add(new Class1("name1","number1")); 
list2.add(new Class1("name5","number2")); 
list2.add(new Class1("name6","number3")); 
list2.add(new Class1("name2","number4")); 

list1.removeAll(list2); 

list1을 제거하는 요소 후 :

을 먼저 클래스의 equals 메소드와 hashCode 메소드를 오버라이드 (override) 할 필요가

[Class1 {name = 'name3'}, Class1 {name = 'name4'}]

,

편집하는 다른 방법 (자바 8 보낸 가능) removeIf 방법을 사용 equalshashCode을 무시하지 않고

: 여기

list1.removeIf(c -> list2.stream() 
        .map(Class1::getName) 
        .anyMatch(n -> n.equals(c.getName()))); 

I는 그 이름 list1 각 요소를 제거하고있어이 같은지 요소 이름은 list2입니다.

+0

고마워요. 제게 일했습니다. 당신을위한 Upvote – basha

+0

차가운. 이제이 답변을 수락 할 수 있습니다. (https://stackoverflow.com/help/accepted-answer). –