2013-04-29 1 views
1

두 개의 arraylist를 확인한 다음 다른 arrayList에 삽입하고 싶습니다. 그러나 내가 할 때 나는 중복 된 가치를 얻는다. 이 문제를 해결하고 중복을 제거하는 방법. 중간 값을 얻고 중간 값이 세 번째 arraylist의 값보다 크거나 작은 지 확인합니다.중복 된 그래프를 인쇄하는 ArrayList

public static void cluster() { 
    Kmeans kk = new Kmeans(); 
    for (int x = 0; x < cluster1.size() && cluster1 != null; x++) { 
    for (int y = 0; y < cluster2.size() && cluster2 != null; y++) { 
     String s1 = cluster1.get(x); 
     String s2 = cluster2.get(y); 
     try { 
     int median = kk.distance(s1, s2); 
     if (s1.length() > median) { 
      kmcluster1.add(s1); 
      kmcluster2.add(s2); 
     } 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 
} 
public static int median(String q, String w) { 
    int h = q.length(); 
    int h1 = w.length(); 
    int kk = 0; 
    if (h > h1) { 
    kk = h - h1; 
    return kk; 
    } else kk = h1 - h; 
    return kk; 
} 
+0

코드를 형식화하십시오. –

+0

내 코드에서 오류를 발견 할 수 있습니까? – newuser

답변

1

코드에서 버그가 있습니다 :

x < cluster1.size() && cluster1 != null; // will not prevent a null pointer exception 

당신은 루프에 들어가기 전에

cluster1 != null && x < cluster1.size(); 

바람직하게는 한 번만 NULL 확인을 사용해야 하나.

질문에 대답하려면 ArrayList 대신 HashSet을 사용하십시오. 조용히 (예외를 던지지 않고) 중복 추가를 무시합니다. 다음과 같이 클러스터를 인스턴스화 :

Set<String> kmcluster1 = new HashSet<String>(); 
Set<String> kmcluster2 = new HashSet<String>(); 

사용 HashSet 대신 ArrayList 대신 당신이 당신의 데이터 구조는 모든 중복을 포함하지 않을 때마다 LinkedListLinkedHashSet.

2

ArrayList의 설계에 의해 중복 값을 허용합니다. 중복을 금지하는 데이터 구조가 필요한 경우 대신 Set 인스턴스를 사용하는 것이 좋습니다.

+0

이 코드와 같은 예제를 내게 줄 수 있습니까? – newuser

+0

여기서 충분한 코드를 제공하지는 않았지만 원래 질문에서 참조하고있는'ArrayList' 인스턴스는'kmcluster1'과'kmcluster2'라고 가정합니다. 이러한 데이터 구조가 중복 된 값을 무시하기를 원한다면, 어떤 종류의'Set'으로 선언되어야합니다 -'HashSet' 또는'TreeSet'가 작동합니다. 이러한 콜렉션을 다른 타입으로 다시 선언 할 수 없다면, 콜렉션에 값이 이미 존재하는지 ('.contains (...) 메소드를 사용하여) 추가하기 전에 체크한다. – matt