2017-02-04 1 views
0

Java 코드에 문제가 있습니다. 루프를 사용하고 다른 방법은 사용하지 않아야합니다. 내 ArrayLis톤이ArrayList에서 중복 제거 - Java

내 목표는 내 최종 결과가

동일하도록 개 사본 고양이를 제거하는 또한

[개 고양이 개 강아지 고양이 개 말]의 포함 말

[개 고양이 말]

public void removeDouble(){ 

int counter = 0; 
for (int i = 0 ; i < animals.size(); i++) { 
    for (int j = 1+i; j < animals.size() ; j++) 
     //don't start on the same word or you'll eliminate it. 
     if (animals.get(j).equals(animals.get(i)) ) { 
      animals.remove(animals.get(j)); 
      counter++; 

     }         
    } 
} 

"논리"가 정확하지만 내 코드가 제대로 작동하지 않는 것 같아요. 누군가 좀 도와 줄 수 있니?

+1

* "논리"가 정확하지만 내 코드가 잘 작동하지 않는 것 같아요 *. 이것에 대해 자세히 설명해 주시겠습니까? 출력은 무엇입니까? 당신은 그게 무엇을 기대 했습니까? List를 반복하면서 List로부터 요소를 제거하는 것은 바람직하지 않습니다. – CKing

답변

0

현재 코드 -이 작업을 수행하는 간단한 방법

for (int i = 0; i < animals.size(); i++) { 
    for (int j = 1 + i; j < animals.size(); j++) 
     if (animals.get(j).equals(animals.get(i))) { 
      animals.remove(animals.get(j)); // this would remove the current element only if the previous element is same as the current element 
      // since the index `j` would change post that 
     } 
    } 
} 

animals.stream().distinct().collect(Collectors.toList()).forEach(System.out::print); 

또는 사용하고 -

Set<String> distAnimal = new HashSet<>(animals); 
System.out.println(Arrays.toString(distAnimal.toArray())); 
+1

'나는 루프를 사용하고 다른 방법은 사용하지 않아야합니다. ' – camickr

0

당신의 당신이 그들을 반복 될 때 항목을 제거, 인덱스를 포함하는 배열이 있고, double을 찾으면 인덱스 배열에 인덱스를 추가하십시오. 인덱스 배열을 반복하고 동물 arraylist에서 삭제하십시오.

2

내부 루프의 논리가 올바르지 않습니다.

동일한 항목이 목록에 연속적으로 나타날 때마다 항목을 건너 뜁니다.

"개", "개", "개", "고양이"가 있다고 가정 해보십시오. 색인 1에서 "개"를 제거하면 목록은 이제 "개", "개", "고양이"가됩니다.

"j"색인이 이제 2로 증가하므로 다음 테스트에서 "dog"항목이 아닌 "cat"항목에 액세스 할 수 있습니다. 따라서 항목을 제거 할 때마다 목록의 다음 항목을 건너 뛰므로 일치하지 않는 결과가 발생합니다.

  1. 감소 제 j 변수 때마다 목록의 끝에서 내부 루프를 시작 항목을
  2. 을 제거하고 0
을 향해 거꾸로 카운트 다운 :

이 솔루션은 하나에

입니다

1

목록 끝에서 시작하여 카운터를 감소시키는 것이 더 간단합니다. i에서 double을 제거한 후 전체 문자열을 확인하지 않고 중단 할 수 있습니다. j에 도달하면 추가 double이 감지되기 ​​때문입니다.

for(int i=animals.size()-1; i>0; i--) { 
     for(int j=i-1; j>=0; j--) { 
      if(animals.get(i).equals(animals.get(j))) { 
       animals.remove(i); 
       break; 
      } 
     } 
    } 

이전 요소를 제거 (당신은 계정에 그것을 적용하려면 인덱스를 조정 실패) 때문에 인덱스를 변경하게 진행할 뒤로 문제를 피할 이동.

당신이 사용하던 논리에 대한 또 다른 문제는 remove (index)가 아니라 remove (object)를 사용하여 첫 번째로 일치하는 객체가 제거되도록합니다.그러나 예상 출력을 기반으로 첫 번째 일치하는 개체의 순서를 유지하려고합니다. 대신 색인을 통해 마지막으로 일치하는 객체를 제거해야합니다.

for(int i=0; i<animals.size()-1; i++) { 
     ListIterator<?> iter = animals.listIterator(i+1); 
     while(iter.hasNext()) { 
      if(animals.get(i).equals(iter.next())) { 
       iter.remove(); 
      } 
     } 
    } 
:


거꾸로보다는 전진하기를 원하지만 당신은 제거 후 인덱스에 조정을하지 않으려면,이 반복자의 remove 메소드를 사용하는 것이 가능하다

아쉽게도 여기서 외부 루프는 ConcurrentModificationException이 발생하기 때문에 반복기를 사용할 수 없습니다.


마지막으로, 하나의 명시적인 루프를 해결하기 위해 하위 목록을 사용할 수

for(int i=0; i<animals.size()-1; i++) { 
     animals.subList(i+1, animals.size()).removeIf(animals.get(i)::equals); 
    } 
0

당신은 이런 식으로 할 수 있습니다.

ArrayList<String>list=new ArrayList<>(); 
    list.add("A"); 
     list.add("B"); 
     list.add("C"); 
     list.add("A"); 
    System.out.println("Before "+list); // output[A,B,C,A] 


    Set<String> listWithoutDuplicates = new LinkedHashSet<String>(list); 
    list.clear(); 

    list.addAll(listWithoutDuplicates); 
    System.out.println("list without duplicates : " + list);// output[A,B,C] 
0

모든 답변 주셔서 감사합니다. 나는 여전히 몇 가지 문제가있다. 이것은 내가 생각해 냈다.

int counter =0; 
for(int i = 0 ; i < animals.size() ; i++){ 
    for(int j = animals.size() -1 ; j>i ; j--){ 
     if(animals.get(j).equals(animals.get(i))){ 
      counter++; 

} 

    } 
} 
    System.out.println(counter); 
} 

이제 ArrayList의 끝에서 내부 루프를 시작할 것이다. 우선 순위는 현재 루프 작동을 얻은 다음 제거 등을 추가하는 것입니다.

건배!