2009-12-10 2 views

ответ

2

Я думаю, что настоящее опрятное решение для обеспечения уникальных списков массивов - this one, если это не слишком много кода для того, чего вы пытаетесь достичь.

public class UniqueOverridingList extends ArrayList { 

    public enum LAST_RESULT { 
     ADD, OVERRIDE, NOTHING; 
    } 

    private LAST_RESULT lastResult; 

    public boolean add(T obj) { 
     for (int i = 0; i < size(); i++) { 
      if (obj.equals(get(i))) { 
       set(i, obj); 
       lastResult = LAST_RESULT.OVERRIDE; 
       return true; 
      } 
     } 
     boolean b = super.add(obj); 
     if (b) { 
      lastResult = LAST_RESULT.ADD; 
     } else { 
      lastResult = LAST_RESULT.NOTHING; 
     } 
     return b; 
    } 

    public boolean addAll(Collection c) { 
     boolean result = true; 
     for (T t : c) { 
      if (!add(t)) { 
       result = false; 
      } 
     } 
     return result; 
    } 

    public LAST_RESULT getLastResult() { 
     return lastResult; 
    } 

} 
+0

Огромное спасибо – Kumar

+0

@ JohanWikström, они должны пройти через Faq, прежде чем начать здесь – Sameer

1

Класс Дэвид Хедлунд предположил, может быть намного короче:

public class UniqueArrayList extends ArrayList { 
    /** 
    * Only add the object if there is not 
    * another copy of it in the list 
    */ 
    public boolean add(T obj) { 
     if(this.contains(obj)) 
      return false; 
     return super.add(obj); 
    } 

    public boolean addAll(Collection c) { 
     boolean result = false; 
     for (T t : c) { 
      if (add(t)) { 
       result = true; 
      } 
     } 
     return result; 
    } 
} 

Операция addAll изменяется тоже. В documentation указывается:

Возвраты: true, если этот список изменился в результате вызова.

Я изменил метод, чтобы отразить это поведение. Еще одна проблема. В документации метода addAll() также указывается:

Добавляет все элементы указанной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором указанной коллекции.

Порядок может быть разорван при использовании этого метода. Возможным обходным решением этой проблемы может быть не поддержка метода addAll.

+1

Это добавляет элемент O (n). Вместо этого используйте набор! –

15

Try ниже код,

ArrayList<String> values=new ArrayList<String>();<br> 
String newValue;<br> 

// repeated additions:<br> 
if (!values.contains(newValue)) {values.add(newValue);} 
+1

короткий и умный ответ +1 – XtreemDeveloper

+0

что касается пользовательского bean-класса? Как решить проблему с дублирующимся значением? –

+0

@AnandSavjani переопределяет equals() и hash() в вашем bean-компоненте, сравнивает пользовательское поле –

6
  HashSet hs = new HashSet(); 

      hs.addAll(demoArrayList); // demoArrayList= name of arrayList from which u want to remove duplicates 

      demoArrayList.clear(); 
      demoArrayList.addAll(hs); 
+0

Многое более эффективно, чем ArrayList.contains() – gor

26

Попробуйте это ...

ArrayList<String> values=new ArrayList<String>(); 
    HashSet<String> hashSet = new HashSet<String>(); 
    hashSet.addAll(values); 
    values.clear(); 
    values.addAll(hashSet); 

Счастливый кодирования ...

+0

совершенная точка выстрела, очень умный ответ. –

+1

Все, что вы сделали, это скопировать главный ответ ... –

+0

@BrandonLaBraunЧтобы быть справедливыми, верхний ответ скопировал его также, из другого сообщения –

Смежные вопросы