Как удалить повторяющееся значение из arrayylist в Android

ArrayList<String> values=new ArrayList<String>();
values.add("s");
values.add("n");
values.add("a");
values.add("s");

В этом массиве я хочу удалить повторяющиеся значения.


person Kumar    schedule 10.12.2009    source источник
comment
Тогда почему бы вам не использовать набор?   -  person Cshah    schedule 10.12.2009


Ответы (5)


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

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

Удачного кодирования ...

person Silambarasan Poonguti    schedule 10.03.2015
comment
идеальная точка выстрела, очень умный ответ. - person Gundu Bandgar; 13.04.2016
comment
Все, что вы сделали, это скопировали верхний ответ ... - person Brandon LaBraun Curry; 07.06.2016
comment
@BrandonLaBraunCurry, честно говоря, главный ответ также скопировал его из другого сообщения - person Tim; 08.07.2016
comment
сногсшибательный ... - person Ravi.Sh; 17.03.2020

Попробуйте код ниже,

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

// repeated additions:
if (!values.contains(newValue)) {values.add(newValue);}
person Freyr    schedule 17.01.2013
comment
короткий и умный ответ +1 - person XtreemDeveloper; 18.09.2014
comment
как насчет пользовательского класса bean? Как решить проблему дублирования значений? - person Anand Savjani; 21.06.2016
comment
@AnandSavjani переопределить equals () и hash () в вашем bean-компоненте, сравнить по настраиваемому полю - person Tim; 08.07.2016
comment
Это также будет поддерживать порядок в отличие от хеш-набора +1. - person Rushi M Thakker; 15.11.2019

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

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;
    }

}
person David Hedlund    schedule 10.12.2009
comment
@ JohanWikström, прежде чем начинать здесь, необходимо тщательно изучить Faq. - person Tofeeq Ahmad; 07.01.2013

Предложенный Дэвидом Хедлундом класс можно сделать намного короче:

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 также изменена. в документации говорится:

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

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

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

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

person Scharrels    schedule 10.12.2009
comment
Это делает добавление элемента O (n). Вместо этого используйте набор! - person Kevin Bourrillion; 10.12.2009

person    schedule
comment
Намного эффективнее, чем ArrayList.contains () - person gor; 01.12.2016
comment
Обратите внимание, что порядок добавленных элементов в HashSet будет неорганизованным. - person Prajwal Waingankar; 16.02.2021