удалить дублированные строки в ArrayList <ArrayList <String>> - PullRequest
2 голосов
/ 09 июля 2010
public void removeDuplicates (ArrayList<ArrayList<String>> strings) {

    Set<ArrayList<String>> s = new LinkedHashSet<ArrayList<String>>(strings);
    strings =  new ArrayList<ArrayList<String>>(s);
}

Я хочу удалить дублирующиеся строки в ArrayList<ArrayList<String>>, я хочу использовать LinkedHashSet и сравнить ArrayList между собой, и если это то же самое, не вставляйте его.я знаю, что мне нужно Comparator, но я не знаю, как реализовать это для сравнения ArrayList внутри ArrayList.

Thx

Ответы [ 5 ]

4 голосов
/ 09 июля 2010

Вы можете попробовать использовать Set - и если вы реализуете свой собственный List или расширяете ArrayList для ОС, то "equals ()" действует так, как вы ожидаете.

Таким образом, когда вы добавляете arrayList, он будет автоматически сравниваться с остальными.

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

В чем дело?


Вы сказали, что хотите использовать LinkedHashSet - хорошо, это то же самое, что и мое первоначальное предложение. (вам не нужен компаратор) Вы можете расширить ArrayList и заставить его метод equals () соответствовать вашему желанию:

  • одинаковое количество элементов
  • те же элементы
  • и т.д ...
1 голос
/ 09 июля 2010

Вы не упомянули, важен ли порядок.

Если порядок элементов во внутреннем списке не важен, это должно работать: -

List<List<String>> list = new ArrayList<List<String>>();
list.add(Arrays.asList(new String[] {
        "a",
        "b",
        "c"
}));
list.add(Arrays.asList(new String[] {
        "b",
        "a",
        "c"
}));
list.add(Arrays.asList(new String[] {
        "a",
        "b",
        "c",
        "d"
}));

// use set to remove duplicates
Set<Set<String>> set = new HashSet<Set<String>>();
for (List<String> innerList : list) {
    set.add(new HashSet<String>(innerList));
}

// convert back to list
List<List<String>> noDupList = new ArrayList<List<String>>();
for (Set<String> innerSet : set) {
    noDupList.add(new ArrayList<String>(innerSet));
}

// print out for debugging
for (List<String> l : noDupList) {
    System.out.println(l);
}
0 голосов
/ 09 июля 2010

Согласитесь с @Leni выше, просто переопределите ArrayLists's равно , и реализация LinkedHashSet должна автоматически фильтровать дубликаты.

Из Java doc: Коллекция, которая не содержит повторяющихся элементов. Более формально, множества не содержат пары элементов e1 и e2, таких как e1.equals (e2), и не более одного нулевого элемента. Как следует из его названия, этот интерфейс моделирует абстракцию математического набора

0 голосов
/ 09 июля 2010

Скажите, что список содержит

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Что вы ожидаете от набора?Два элемента?Один элемент?

Можете ли вы сказать, как вы хотите сравнить ArrayLists?

Если это сравнение один к одному - "они равны, если они содержат то же самое элементов в одинаковом порядке "тогда

sets = new HashSet<ArrayList<String>>(lists);

должно быть достаточно.

Если вы хотите иметь более сложные правила сравнения, тогда вам нужно переопределить равноМетод, как сказал выше Ленин Кирилов.Но чем больше список, тем выше производительность.

0 голосов
/ 09 июля 2010

Вам нужно будет выполнить грубое сравнение и сравнение каждого массива с любым другим списком массивов.

начните с индекса 0 и сравните его элементы с индексом 1-n, как только вы найдете

Предполагая ArrayList myDatastructure, следующий псевдо-код:

for (int i =0; i < myDatastructure.count() ; i++){

    for (int j = i+1 ; i< mydatastructure.count() ; j++){
      compare(myDatastructure.get(i),myDataStructure.get(j));

    }
}

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

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

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

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