2013-03-03 5 views
3

집합이나 .contains() 메소드를 사용하지 않고 목록에서 중복 항목을 제거해야하는 인트ro java 과정에 대한 할당 질문을 처리하려고합니다. 기본적으로 iterators와 .equals() 메소드를 사용한다. 내 코드는 다음과 같습니다 :반복자를 사용하여 자바 목록에서 중복 제거하기

누군가가 내가 뭘 잘못하고 어떻게해야하는지에 대해 설명해 주시면 큰 도움이 될 것입니다. 테스트를 준비하는 것이므로 정확한 코드 조각이 아닌 설명을 부탁드립니다.

+1

좋은 방법! 이제 어떻게/어디서 일이 잘못되고있는 지 알려줄 수 있습니까? – Floris

+1

결코 변경하지 않는'newList'를 반환하고 있습니다. – cIph3r

+0

우선 컬렉션의 첫 번째 항목은 항상 지워집니다. (반복되는 첫 번째 요소가 항상 동일하므로이 문제를 피하기 위해 인덱스 0 대신 인덱스 1에서 루프를 시작할 수 있다고 생각합니다. 내가 중요하다고 생각하는 것)하지만 더 중요한 것은 항목 자체 (예 : A, B, C, B) 옆에있는 다른 위치에 중복 된 항목을 추가하면 프로그램이 무기한으로 계속 실행된다는 것입니다. 설명 : 모든 중복 된 항목을 나란히 놓고 newList가 중복되지 않으면 프로그램이 의도 한대로 작동합니다. – user1542396

답변

1

목록을 반복하고 요소를 제거하면 목록이 변경됩니다 ... 요소 "4"를보고 제거하려고 결정한 경우 다음 요소는 무엇입니까? 힌트 : 원래 요소 "5"가 아니라 새로운 요소 "5"가 아닙니다 ...

4

정확히 무엇이 잘못 될지 설명하기보다는 디버거를 사용하여 프로그램이 무엇인지 확인합니다 현재하고 있습니다. 특히 iter.next()에 전화 할 때마다 반복기가 반환하는 것을 확인하십시오. 올바른 솔루션

힌트 :

  1. 두 개 이상의 반복자를 사용해야합니다 ... 당신은 당신이 반환하는 목록에 아무것도 넣어되지 않은
  2. .
  3. 새 목록을 만들고 반환하는지 또는 기존 목록에서 요소를 제거할지 생각해야합니다. 둘 다하는 것은 의미가 없습니다. 당신이 질문을 할 때 앞으로

는, 프로그램이 실제로 어떻게해야 무엇의 더 나은 설명을 제공해야한다. 예 :

  • unique 메서드가 인수 목록에서 요소를 제거하거나 고유 요소가 포함 된 새 목록을 반환하는지 여부는 알 수 없습니다.
  • 목록의 요소 순서가 중요한지 여부는 밝히지 않았습니다.
  • 입력 목록을 변경하는 것이 괜찮은지 여부를 말하지 않습니다.

이러한 모든 문제는 이와 같은 문제를 해결하는 방법을 결정하는 데 중요합니다. 특히 현실 세계에서. 당신의 과제에도 이런 것들이 언급되어 있지 않다. 당신은 여전히 ​​당신의 코드가 어떻게 동작 할 것인가를 스스로 결정할 필요가있다 ... 그리고 이것을 javadoc 주석으로 문서화한다.

3
  • i==0 당신은 단지 그것을 제거 할 수 있도록 iterator.next()get(i)이 같은 요소가 될 것입니다. 동일한 목록에 대해
  • 을 입력하면 for 루프 내에서 iterator.remove()을 더 잘 수행하지 않는 것이 좋습니다.
  • 당신은 newList-add 아무것도하지 않았다, 그리고
  • 이 과제에 대한 제안 단순히 그것을 반환 :

요소 인 경우, 먼저 종류 목록, 다음, 그것을 통해 갈 수있다 이전 요소와 같으면 요소를 제거하십시오. 원하는 경우 이러한 고유 한 요소를 보유 할 수있는 새로운 목록을 만들 수 있습니다.

내 2 센트

+0

목록을 정렬하면 목록 요소의 순서가 불안정 해집니다. 문제는 OP가 그 방법이 무엇을하기로되어 있는지를 적절하게 설명하지 않았고 그의 기존 코드가 "다중 인격 장애"에 시달리고 있다는 것입니다. –

+0

@StephenC 맞아. 전자의 순서는 정렬에 의해 변경 될 것입니다. 그런 다음 질문/과제에서 중복을 제거하는 방법을 정의해야합니다. 예 : "dups가 발견되면 항상 첫 번째/마지막/n 번째 요소를 유지합니다." 그렇지 않으면 주문이 "변경"될 수도 있습니다. 어쨌든 Q가 잘 정의되면 솔루션은 내포하기 어렵지 않습니다. 음, 'nth'요소를 유지하는 것은 까다로울 수 있습니다. – Kent

0
code extract without using iterator 

import java.util.ArrayList; 
import java.util.List; 

    public class Test { 
    final static List<String> str = new ArrayList<String>(); 
    public Test(){ 

     str.add("A"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     str.add("A"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     str.add("B"); 
     str.add("C"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     System.out.println(str); 


    } 

    public List<String> rmovedDuplicate(List<String> str){ 

     List<String> finalList = new ArrayList<String>(); 

     for(int i =0; i<str.size();i++){ 
      for (int j=i+1; j<str.size();j++){ 
       if(str.get(i).equals(str.get(j))){ 
        str.remove(j); 
        i=0; 

       } 
      } 
     } 

     System.out.println("final list :"+str); 
     return str; 
    } 

    public static void main(String args[]){ 
     Test t = new Test(); 
     t.rmovedDuplicate(str); 
    } 

} 
+0

@kishor : Set의 기능은 중복을 제거하는 것입니다. 당신이 세트를 사용하고 있다면,리스트를 사용하거나 세트로 변환 할 필요가 없습니다. 직접 세트를 사용할 수 있습니다. 요소를 집합에 추가하면 중복되지 않는 요소가 생깁니다. –

0

은 다음과 같습니다 수행의 또 다른 간단한 방법.

import java.util.HashSet; 
import java.util.List; 
import java.util.Set;public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String args[]) throws SQLException { 
     System.out.println("Entered Main"); 
     Test(); 
     System.out.println(str); 
     set.addAll(str); 
     System.out.println(set); 
     str.clear(); 
     str.addAll(set); 
     System.out.println(str); 
    } 
    final static List<String> str = new ArrayList<String>(); 
    final static Set<String> set = new HashSet<String>(); 
    public static void Test(){ 

     str.add("A"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     str.add("A"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     str.add("B"); 
     str.add("C"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     str.add("B"); 
     str.add("C"); 
     str.add("C"); 
     str.add("C"); 
     str.add("D"); 
     System.out.println(str); 
    } 

목록을 채우는 테스트 방법은 Vidyarani Shinde의 대답에서 복사됩니다.

+0

@Vidyarani : 그렇습니다. 그러나 목록에 데이터가 필요하므로 방금 다시 목록에 추가했습니다. –

0

way is ..first to check the list has that value if so ,skip adding it if not add the element and u get your unique list...instead of running intensive Iterator operation :)

Example

List<Integer> listOfUserIds = new ArrayList<Integer>(); 
    Integer UserIdCheck = 0; 
    for (User userTest : userCollection) { 
    UserIdCheck = userService.getUserByRegionCode(userTest.      .getRegionId()); 
    if (!listOfUserIds.contains(UserIdCheck)) //check befor adding listOfUserIds.add(UserIdCheck); 
     } 
    } 
    return listOfUserIds.toString().replace("[", "").replace("]", ""); // if u like can remove [ and ] from the list and simply return a string like "4,5,6" 
-1

예상대로 ArrayListArrayListIterator 클래스가 구현되어, ArrayListListADT 구현한다고 가정하고, BadListException는 제로와 체크 예외 매우 간단한 - 인수 생성자. 또한 null 요소가 목록에 추가되지 않을 수도 있다고 가정합니다.

필자는 반복기를 사용하여 아래에 지정된 Java 메소드를 완료해야합니다. 이러한 요구 사항을 충족해야 내 솔루션 :

  1. 명시 적으로리스트를 횡단에 대한 반복자를 사용해야합니다

  2. contains 방법
  3. 에게 사용해서는 안됩니다 (즉, 당신은에 대한 루프 또는 Java의 확장-에 대한 루프를 사용하지 않을 수 있습니다) (contains 제외) ListADT 방법을 사용 ListADT.iterator() 포함한 on-line reading,에서 설명하지만
  4. 는 파라미터의 내용을 수정하지 않아야들 List 기타 다른 방법을 사용해서는 안된다.

함수의 골격 :

내 솔루션은 반복자 방법을 포함하여 읽는 온라인에 설명 된 ListADT 인터페이스 (에있는 방법을 사용하는지 확인해야
public static ListADT<String> union(ListADT<String> list1, ListADT<String> list2) { 
    // If list1 or list2 (or both list1 and list2) is null, throw a BadListException. 
    // If list1 and list2 are both empty, return a new empty list. 
    // If list1 is empty (but not list2), return a new list containing the strings in 
    //  list2 with all duplicates removed. 
    // If list2 is empty (but not list1), return a new list containing the strings in 
    //  list1 with all duplicates removed. 
    // Otherwise, create and return a new list that contains the strings in list1 and 
    //  the strings in list2 with all duplicates removed. 
    // 
    // Examples: 
    // list1: "a","b","c"   list2: "d","e","f"  result: "a","b","c","d","e","f" 
    // list1: "a","c","b","d"  list2: "e","d","a","f" result: "a","c","b","d","e","f" 
    // list1: "a","b","c","b","a" list2: "c","a","b"  result: "a","b","c" 
    // 
    // Note: the list returned does not need to be in any particular order 

, 상술 한 바와 같이).

어떻게하면됩니까?

+0

새로운 질문을해야합니다. 귀하는 질문을 이전 질문에 대한 답변으로 게시하여 답변을 얻지 못할 것입니다. 귀하의 "답변"을 편집 했으므로 복사하여 합리적으로 형식화 된 질문에 붙여 넣을 수 있습니다. 일단 그렇게하면 삭제해야합니다. – zondo

0

저는 각각 각각 고급을 사용했으며 ArrayListHashSet으로, 또 다시 ArrayList으로 변환했습니다. 두 가지 솔루션 모두 정상적으로 작동합니다. 어느 하나를 선택할 수 있습니다.

0

복제 된 값만 한 번만 반환하는 자체 반복기를 만들 수 있습니다.

public class NoDuplicatesIterator<T> implements Iterator<T> { 

    private final List<T> array; 
    private final List<T> encountered; 
    private int index = 0; 

    public NoDuplicatesIterator(List<T> array) { 
     this.array = array; 
     encountered = new ArrayList<>(); 
    } 

    @Override 
    public boolean hasNext() { 
     if (index > array.size() - 1) { 
      return false; 
     } 

     while (encountered.contains(array.get(index)) && index < array.size() - 1) { 
      index++; 
     } 

     return index <= array.size() - 1; 
    } 

    @Override 
    public T next() { 
     encountered.add(array.get(index)); 
     return array.get(index++); 
    } 

} 

사용법 :

public class Main { 

    public static void main(String[] args) { 
     List<Integer> array = Arrays.asList(new Integer[]{100, 2, 2, 1, 1, 2, 3, 3, 15, 4, 4, 5, 6, 7, 7, 8, 99, 99, 100, 99, 2, 77, 23, 14, 2, 15}); 
     NoDuplicatesIterator<Integer> it = new NoDuplicatesIterator(array); 

     while (it.hasNext()) { 
      System.out.println(it.next()); 
     } 
    } 

} 
는 "숙제 질문에"같이 분석의
관련 문제