2012-12-05 2 views
1

나는이 형식으로 개체의 목록이 있습니다중복 된 목록 항목의 목록을 만드는 방법은 무엇입니까?

class myObj { 

    private String identifier; 

    public myObj(String identifier){ 
     this.identifier = identifier; 
    } 

} 

List<myObj> allobjects = new ArrayList<myObj>(); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("123")); 
allobjects.add(new myObj("1234")); 
allobjects.add(new myObj("12345")); 
allobjects.add(new myObj("12")); 
allobjects.add(new myObj("12")); 

별도의 목록에 중복 된 개체를 추출하는 우아한 방법은 무엇입니까? 위의 예제에서 두 개의 목록을 포함하는 새 List가 반환됩니다. 첫 번째 목록 가 포함

new myObj("123"); 
new myObj("123"); 
new myObj("123"); 
new myObj("123"); 

번째 목록이 포함 목록의 각 요소에 다음

List<List<myObj>> newList = new ArrayList<List<myObj>> 

: 그리고

new myObj("12"); 
new myObj("12"); 

가능한 해결책은 새로운 객체를 생성하는 것이다 'allobjects'는 각 요소를 반복하고 두 번 이상 포함 된 각 요소를 목록에 추가합니다. 그런 다음 에서 현재 요소의 반복 끝에 새롭게 생성 된 목록을 'newList'에 추가하십시오.

이게 맞습니까? 아니면 다른 해결책이 있습니까?

+0

고유 한 요소가 자체 목록을 가지고있는 솔루션도 괜찮습니까? – durron597

+0

@ durron597 필자는 무시할 수있다. size == 1의 목록 항목 –

+1

사용자 정의 'Comparator '를 사용하여 목록을 정렬 (또는 새 목록을 만들고 그 목록을 정렬)한다. 정렬 된 목록을 살펴보고 인접한 중복을 감지하십시오. 이 방법은 제안 된 솔루션이 * O (n²) * 인 동안 알고리즘은 * O (nlogn) * 일뿐입니다. – brimborium

답변

2

당신이지도 키로 사용할 수 있도록 추가는, 동일와 hashCode의 메소드 myObj로 클래스 :

class myObj { 

    private String identifier; 

    public myObj(String identifier){ 
     this.identifier = identifier; 
    } 

    public int hashCode(){ 
     return identifier.hashCode(); 
    } 

    public boolean equals(Object o){ 
     return identifier.equals(((myObj)o).identifier); 
    } 
} 

그런 다음지도 선언

Map<myObj, List<myObj>> map = new HashMap<myObj, List<MyObj>>() 

을하고 반복 원래 목록. myObj를 맵 키로 사용하여 매번 myObj에 해당하는 목록을 검색합니다. 특정 myObj를 처음 접하는 경우 목록을 만드는 것을 잊지 마십시오.

for(myObj obj : allobjects){ 
    List<myObj> list = map.get(obj); 
    if(list == null){ 
     list = new ArrayList<myObj>(); 
     map.put(obj, list); 
    } 
    list.add(obj); 
} 
1

같음을 구현 한 다음 contains를 사용하고 다른 컬렉션을 확인하여 반복 할 수 있습니다.

jdk8s의 lambdas를 사용하는 방법이 있습니다.

TransformService transformService = (inputs1, inputs2) -> { 
      Collection<String> results = new ArrayList<>(); 
      for (String str : inputs1) { 
       if (inputs2.contains(str)) { 
        results.add(str); 
       } 
      } 
      return results; 
     }; 
     Collection<String> inputs1 = new ArrayList<String>(2) {{ 
      add("lemon"); 
      add("cheese"); 
      add("orange"); 
     }}; 
     Collection<String> inputs2 = new 
       ArrayList<String>(2) {{ 
        add("apple"); 
        add("random"); 
        add("cheese"); 
       }}; 
     Collection<String> results = transformService.transform(inputs1, inputs2); 
     for (String result : results) { 
      System.out.println(result); 
     } 
    } 

    public interface TransformService { 
     Collection<String> transform(Collection<String> inputs1, Collection<String> inputs2); 
    } 
+0

나는이 필요가 java6에서 작동하도록 언급해야한다. 그래서 lambdas가 없다 : ( –

+0

@ user470184 잘 대답은 그대로 있고, 그냥 목록을 반복하며, 포함한다면, 새로운 목록에 추가 .... – NimChimpsky

관련 문제