2013-12-16 7 views
6

파일의 각 행을 읽는 동안 목록을 채우는 중 ArrayList에 중복 항목이 추가되는 것을 방지하려고합니다. 파일의 각 행은 "node1 node2"(탭 구분 기호) 형식입니다. 여기서 복제본은 "node1 node2"또는 "node2 node1"이 될 수 있습니다. 여기에 시도하고이 작업을 수행하려면 코드입니다 :JAVA : ArrayList에 대한 중복 항목 방지

while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    for (int i=0; i <= edgesnumber; i++) { //edgesnumber = edges.size() 

     if (tempnodelist[0] && tempnodelist[1] != edges.get(i)) { 

      edges.add(line); 

      } 
     } 

    nodes.add(tempnodelist[0]); 
    nodes.add(tempnodelist[1]); //intial intended use of tempnodelist. 

} 이미 각 노드의 HashSet의를 만들기 위해 각 라인을 분할하고있어 이후

, 나는 중복 확인하기 위해 이것을 사용하려고 해요 . 지금은 구문에 대한 권리를 얻지 못하고 있습니다. 어떻게 중복에 대한 ArrayList의 이전 항목을 통해 확인할 수 있으며, ArrayList를 채우기를 계속 whist 추가되지 않도록? 현재이 코드에 어떤 문제가 있습니까?

불명확 한 점이 있으면 무엇이든지 문의하십시오.

미리 감사드립니다. LinkedHashSet 예측 가능한 반복 순서 (삽입 순서)를 가지고 있으며이 때문에 Set

+4

는, 당신은'Set' 아닌'List' 할 것입니다. –

+0

하지만 항목은 되돌릴 수 있으며 여전히 사본으로 간주됩니다 ... 설정하면 표시되지 않겠습니까? – user2941526

+0

Set는'equals()'를 사용하여 중복 된 것을 찾습니다. 집합에 넣을 개체에 대한 특정 클래스를 만들고이 클래스에서 equals()를 다시 정의해야합니다. –

답변

12

ArrayList로 변환 후 LinkedHashSet 사용하고. 예를

LinkedHashSet<String> uniqueStrings = new LinkedHashSet<String>(); 

uniqueStrings.add("A"); 
uniqueStrings.add("B"); 
uniqueStrings.add("B"); 
uniqueStrings.add("C"); 
uniqueStrings.add("A"); 

List<String> asList = new ArrayList<String>(uniqueStrings); 
System.out.println(asList); 

출력됩니다

[A, B, C] 
+0

클래스 객체와 함께 ArrayList와 함께 사용하고 싶습니다. 작동하지 않았습니다. –

+0

@AnantShah 당신은'ArrayList'에서 유일한'Class' 객체를 원하십니까? 너가 말하는게 이거니? 그리고 효과가없는 것은 무엇입니까? 그것을 시도 할 때, 그것은 작동합니다. 나는 당신이 의견을 사용하는 것을 돕는 것이 어렵다고 생각한다. 질문을하고 예제 코드를 제공하십시오. –

+0

나는 클래스 객체 데이터가 중복 된 동일한 크기의 arraylist를 반환했다. 하지만 그 두 가지 방법을 equals() 및 hashCode() 클래스 개체 파일 안에 재정의합니다. 그런 다음 효과가있었습니다. 해결책 및 신속한 답변을 보내 주셔서 감사합니다. :) –

0

를 들어

첫째, 문자열을 비교하는 동일 사용합니다.

둘째, 당신은 설정보다는 목록

을 사용할 수 있습니다 그리고 마지막으로, 당신은 항목이 이미 존재하는 경우 확인 contains 방법을 사용할 수 있습니다.

1

ArrayList를 추가 할 때마다 이전 항목을 모두 반복하고 O (N) 인 중복 항목 (.contains()을 사용할 수 있음)이 있는지 확인해야합니다.

더 나은 세트를 사용하는 것이 좋습니다.

2

이미 추가 된 목록을 사용하여 계속 읽기 라인의 순서를 유지하지만 (이 설명의 두 가지 형태로) 중복 당신이 경우 라인을 결정하는 설정을 사용할 수 있습니다 원하는 경우 :

Set<String> duplicates = new HashSet<String>(); 
while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    String lineReversed = tempnodelist[1] + delimiter + tempnodelist[0]; 

    if (!duplicates.contains(line) && !duplicates.contains(lineReversed)) { 
     edges.add(line); 
    } 
} 
+0

reverse()는 "node2 node1"을 "1edon 2edon"으로 바꿀 것입니다. 'duplicates'가 루프 외부에 있어야하지 않습니까? –

+1

아 맞아 ... 그게 – giorashc

+0

고쳐 줄거야. 어떤 이유로 이건 중복되는 것을 막을 수는 없어. "123 234"와 "234 123"의 txt를 입력해도 ArrayList는 두 항목으로 채워집니다./ – user2941526

-1

그것은 당신이 정말이에 관계없이 단어의 순서의 중복없이 쌍의 컬렉션을 만드는 Set<Set<String>>

Set<Set<String>> pairs = ... 
try(BufferedReader br = ...) { 
    for(String line; (line = br.readLine()) != null;) 
     pairs.add(new HashSet<String>(Arrays.asList(line.split(" "))); 
} 

입니다 원하는 같은 소리.

0
ArrayList<String> ar=new ArrayList<String>(); 
String a[]={"cat","bat","cat","knife"}; 
for(int i=0;i<a.length;i++){ 
    if(!ar.contains(a[i])){ 
     ar.add(a[i]); 
    } 
} 

배열 목록을 만들고 삽입 할 문자열이 들어 있는지 확인하십시오. 문자열이 없으면 배열 목록에 추가 할 수 있습니다. 이렇게하면 배열 목록에서 중복 된 항목을 피할 수 있습니다.위의 코드의 배열 목록에서

요소는 중복 항목을하지 않으려면

cat bat knife