Что лучший способ состоит в том, чтобы удалить дубликаты в Массиве в Java?

public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

Поскольку как 1, так и 3 являются ints, результат не округлен, но он усечен. Таким образом, вы игнорируете фракции и выполняете только целые.

Чтобы избежать этого, по крайней мере одно из ваших чисел 1 или 3 как десятичная форма 1.0 и / или 3.0.

15
задан Liggy 10 December 2008 в 20:07
поделиться

8 ответов

Я согласился бы с Вашим подходом переопределить hashCode() и equals() и использовать что-то, что реализует Set.

Выполнение так также делает это абсолютно ясным любым другим разработчикам, что недублирующаяся характеристика требуется.

Другая причина - Вы добираетесь для выбора реализации, которая удовлетворяет потребности лучше всего теперь:

и Вы не должны изменять Ваш код для изменения реализации в будущем.

21
ответ дан 1 December 2019 в 01:06
поделиться

Я нашел, что это в сети

Вот является двумя методами, которые позволяют, Вы для удаления дубликатов в ArrayList. removeDuplicate не поддерживаете порядок, где, поскольку removeDuplicateWithOrder поддерживает порядок с некоторой производительностью наверху.

  1. removeDuplicate Метод:

    /** List order not maintained **/
    public static void removeDuplicate(ArrayList arlList)
    {
     HashSet h = new HashSet(arlList);
     arlList.clear();
     arlList.addAll(h);
    }
    
  2. removeDuplicateWithOrder Метод:

    /** List order maintained **/
    public static void removeDuplicateWithOrder(ArrayList arlList)
    {
       Set set = new HashSet();
       List newList = new ArrayList();
       for (Iterator iter = arlList.iterator(); iter.hasNext();) {
          Object element = iter.next();
          if (set.add(element))
             newList.add(element);
       }
       arlList.clear();
       arlList.addAll(newList);
    }
    
9
ответ дан 1 December 2019 в 01:06
поделиться

Я хотел бы повторить мнение, высказанное Jason в комментариях:

, Почему место самостоятельно в той точке вообще?

, Почему использование массив для структуры данных, которая не должна содержать дубликаты вообще?

Использование Set или SortedSet (когда элементы имеют естественный порядок также) в любом случае для содержания элементов. Если необходимо сохранить порядок вставки, то можно использовать LinkedHashSet, как на него указали.

Необходимость выполнить последующую обработку некоторую структуру данных часто является подсказкой, что необходимо было выбрать другой для начала.

1
ответ дан 1 December 2019 в 01:06
поделиться

В основном Вы хотите LinkedHashSet<T> реализация, которая поддерживает эти List<T> интерфейс для произвольного доступа. Следовательно, это - то, в чем Вы нуждаетесь:

public class LinkedHashSetList<T> extends LinkedHashSet<T> implements List<T> {

// Implementations for List<T> methods here ...

}

реализация эти List<T> методы получили бы доступ и управляли бы лежанием в основе LinkedHashSet<T>. Прием должен иметь этот класс, ведут себя правильно, когда каждый пытается добавить, что дубликаты через эти List<T> добавляют методы (выдающий исключение или повторно добавляющий, что объект в другом индексе был бы опциями: из которого можно или выбрать один из или сделать настраивающимся пользователями класса).

2
ответ дан 1 December 2019 в 01:06
поделиться

Переопределение equals и hashCode и создание набора было моей первой мыслью также. Это - хорошая практика, чтобы иметь некоторую переопределенную версию этих методов так или иначе в Вашей иерархии наследования.

я думаю , что, если Вы используете LinkedHashSet, Вы даже сохраните порядок уникальных элементов...

3
ответ дан 1 December 2019 в 01:06
поделиться

Конечно, исходное сообщение вызывает вопрос, "Как Вы получали тот массив (который мог бы содержать дублированные записи), во-первых?"

Вам нужен массив (с дубликатами) для других целей, или Вы могли просто использовать Набор с начала?

Поочередно, если необходимо знать количество случаев каждого значения, Вы могли бы использовать Map<CustomObject, Integer> для отслеживания количеств. Кроме того, определение Google Collections Мультиклассов сопоставления может быть полезным.

1
ответ дан 1 December 2019 в 01:06
поделиться

Set определенно Ваш лучший выбор. Единственный способ удалить вещи из массива (не создавая новый) состоит в том, чтобы аннулировать их, и затем Вы заканчиваете с большим количеством пустых проверок позже.

0
ответ дан 1 December 2019 в 01:06
поделиться

Разговор из общего стандарта программирования, который Вы могли всегда удваивать, перечисляет наборы затем сравнивание источника и цели.

И если Ваше внутреннее перечисление всегда запускает одну запись после источника, довольно эффективно (псевдо код следовать)

foreach ( array as source )
{
    // keep track where we are in the array
    place++;
    // loop the array starting at the entry AFTER the current one we are comparing to
    for ( i=place+1; i < max(array); i++ )
    {
        if ( source === array[place] )
        {
            destroy(array[i]);
        }
    }
}

, Вы могли возможно добавить повреждение; оператор после уничтожения, но затем Вы только обнаруживаете первый дубликат, но если бы это - все, что Вы будете когда-либо иметь, затем это была бы хорошая маленькая оптимизация.

0
ответ дан 1 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: