2011-04-27 2 views
1

나는 아래의 코드를 가지고 있으며 중복이 있는지 여부와 그 중 하나의 인스턴스 만 제거해야하는지 확인해야합니다. 인스턴스가 하나 뿐인 경우에도 제거됩니다. 어떻게 든 카운터를 사용하고 배열의 크기를 조정해야한다는 것을 알고 있지만 어떻게 확신 할 수는 없습니다.Java의 배열에서 매개 변수의 인스턴스 하나만 제거하려면 어떻게해야합니까?

Listable[]newitems = new Listable[items.length-1]; 
for(int i = 0;i<items.length;i++){ 
    if(items[i]!=itemToRemove){ 
     break; 
    } 
    else{ 
     for(int j = i;j<items.length-1;++j){ 
      newitems[j] = items[j+1]; 
     } 
    } 
    items = newitems; 
} 

답변

0

나는 루프가 즉시 종료 될 것이므로 break이 문제를 일으키고 있다고 생각합니다. 대신 continue 무엇을 원합니까? 언뜻보기에 나머지 코드 대부분은 제대로 작동하는 것처럼 보입니다. 그러나 for 루프에 items = newItems을 설정하면 어떻게됩니까?

+0

오, 매개 변수의 인스턴스가 없으면 메서드는 아무 것도하지 않으므로 중단이 있다고 가정합니다. 확실하지 않습니다. – Sathish

+0

원래 응답에 실수가있었습니다 ... 방금 편집하여 수정했습니다. – NateTheGreat

1

제거 할 요소의 인스턴스를 찾을 때까지 배열을 반복 한 다음 새 배열을 할당해야합니다 (길이가 짧아야하기 때문에) 을 제외하고을 제외하고 원본을 제거 할 항목을 새로운 배열 제거하려는 항목이 아닌 첫 번째 항목 이후에 코드가 중지됩니다. 대신이 시도 :

Listable[] newitems = items; // default in case itemToRemove isn't found 
for (int i = 0; i<items.length; i++) { 
    if (items[i] == itemToRemove) { 
     newitems = new Listable[items.length - 1]; 
     System.arraycopy(items, 0, newitems, 0, i); 
     System.arraycopy(items, i+1, newitems, i, items.length - i - 1); 
     break; 
    } 
} 
items = newitems; 

요구 사항에 따라, == 대신 items[i].equals(itemToRemove)를 사용하는 것이 좋습니다 수 있습니다.

1

LinkedHashSet을 사용하십시오. 집합은 중복 요소가없는 컬렉션입니다. LinkedHashSet를 사용하면 배열 순서를 유지할 수 있습니다. 순서 지정이 중요하지 않은 경우 HashSet을 사용하십시오.

Set<Listable> set = new LinkedHashSet<Listable>(); 
for(Listable l : items) { 
    set.add(l); 
} 
Listable[] newitems = set.toArray(new Listable[set.size()]); 

이 배열을 여러 번 복사 저장하지만 독특한 요소를 구별 할 수 있도록 등호와 Listable의 해시 코드 방법이 제대로 작동에 의존한다.

0

귀하의 설명을 올바르게 읽은 경우, 목록에 2 개 이상있을 때 항목을 유지하기 만하면됩니다.

// count the instances 
    LinkedHashMap<Listable,Integer> map = new LinkedHashMap<Listable, Integer>(); 
    for(int i = 0; i < items.length; i++) { 
     int count = 1; 
     if (null != map.get(items[i])) { 
      count += map.get(items[i]); 
     } 
     map.put(items[i], count); 
    } 

    // add it to the new list if the count is more than 1 
    ArrayList newList = new ArrayList<Listable>(); 
    Iterator it = map.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry)it.next(); 
     if (((Integer)pairs.getValue()) > 1) { 
      newList.add(pairs.getKey()); 
     } 
    } 
    return newList.toArray(); 
관련 문제