Сохранить список уникальных строк в ArrayList - PullRequest
35 голосов
/ 10 февраля 2010

Я читаю данные из текстового файла, поэтому может быть:

John
Mary
John
Leeds

Теперь мне нужно получить 3 уникальных элемента в ArrayList, потому что в выводе файла есть только 3 уникальных значения (как указано выше).

Я могу использовать HashTable и добавить к нему информацию, а затем просто скопировать его данные в Список. Есть ли другие решения?

Ответы [ 6 ]

75 голосов
/ 10 февраля 2010

Зачем вам нужно хранить его в List? Вы действительно требуете упорядочения данных или поддерживает поиск по индексу?

Я бы предложил хранить данные в Set. Если заказ не важен, вы должны использовать HashSet. Однако, если вы хотите сохранить порядок, вы можете использовать LinkedHashSet.

65 голосов
/ 10 февраля 2010

Если у вас есть List, содержащий дубликаты, и вы хотите List без, вы можете сделать:

List<String> newList = new ArrayList<String>(new HashSet<String>(oldList));

То есть, обернуть старый список в набор, чтобы удалить дубликаты, и снова обернуть этот набор в список.

17 голосов
/ 10 февраля 2010

Вы можете проверить list.contains () перед добавлением.

if(!list.contains(value)) {
    list.add(value);
}

Я предположил, что это будет очевидно! Однако добавление элементов в HashSet, а затем создание списка из этого набора будет более эффективным.

4 голосов
/ 10 февраля 2010

Используйте set вместо списка. Взгляните сюда: Учебники по Java-коллекциям и, в частности, о наборах здесь: Учебник по Java-наборам

В двух словах, наборы содержат что-то одно. Отлично :) 1008 *

2 голосов
/ 09 января 2013

Вот как я это решил:

import groovy.io.*;
def arr = ["5", "5", "7", "6", "7", "8", "0"]
List<String> uniqueList = new ArrayList<String>(new HashSet<String>( arr.asList() ));
System.out.println( uniqueList )
0 голосов
/ 16 июня 2013
class HashSetList<T extends Object>
    extends ArrayList<T> {

    private HashSet<Integer> _this = new HashSet<>();

    @Override
    public boolean add(T obj) {
        if (_this.add(obj.hashCode())) {
            super.add(obj);
            return true;
        }
        return false;
    }
}

Теперь я использую такую ​​структуру для небольших программ, я имею в виду, что у вас есть небольшие накладные расходы, чтобы иметь геттеры и сеттеры, но уникальность. Более того, вы можете переопределить hashCode, чтобы решить, будет ли ваш предмет равным другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...