Каков наилучший способ получения дубликатов из большого набора <String>? - PullRequest
0 голосов
/ 14 июля 2011

У меня большой Set<String>, который содержит много слов, скажем:

"ааа, ccc, dDD, AAA, bbB, BBB, ааа, CCc, ..."

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

Vector<String>: ааа, ааа, ааа, ...

Vector<String>: куб. См, куб. См, ...

Vector<String>: bbB, BBB, ...

Я забочусь о производительности, так как в этом наборе много слов.

Ответы [ 4 ]

2 голосов
/ 14 июля 2011

Если вы действительно заботитесь о производительности, вы бы не использовали Vector.Что касается проблемы сортировки, одним из решений было бы использование объекта TreeMap или TreeSet и создание Comparator, которое выполняет желаемое равенство (сортировку).

Примером может быть:

new TreeMap<String,LinkedList<String>>(new Comparator<String>() {

   // comparator here

});

Использование:

LinkedList<String> entry = map.get(nextKey);
if (entry == null) {
  entry = new LinkedList<String>()
  map.put(nextKey, entry);
}
entry.add(nextKey);
0 голосов
/ 14 июля 2011

Это перебирает входной набор один раз, и я сомневаюсь, что вы можете получить намного быстрее, чем это. Замена ArrayList s на LinkedLists может поменять местность на меньшее количество копий, что может повысить производительность, но я сомневаюсь в этом. Вот код:

Set<String> input = new HashSet<String>(Arrays.asList(
    "aaa", "cCc", "dDD", "AAA", "bbB", "BBB", "AaA", "CCc"));

Map<String, List<String>> tmp = new HashMap<String, List<String>>();

for (String s : input) {
    String low = s.toLowerCase();
    List<String> l = tmp.get(low);

    if (l == null) {
        l = new ArrayList<String>();
        tmp.put(low, l);
    }

    l.add(s);
}

final List<List<String>> result = new ArrayList<List<String>>(tmp.values());
0 голосов
/ 14 июля 2011

Если вы можете выбрать Set реализацию, вы можете использовать TreeSet с Comparator, которая сравнивает строки без учета регистра. Затем вы сможете перебирать отсортированный список и легко группировать дубликаты.

0 голосов
/ 14 июля 2011

Я бы создал HashMap<String, Vector<String>> hashMap. Далее для каждой «строки» в вашем наборе

if (!hashMap.containsKey(string.toLowerCase()){
     Vector v = new Vector();
     v.add(string);
      hashMap.put(string.toLowerCase(), v);
} else { 
     hashMap.get(string.toLowerCase()).add(string);
}

В конце, при необходимости, создайте Вектор векторов или работайте с hashmap.valueSet ()

...