从大型 Set 中获取重复项的最佳性能方法是什么?

发布于 2024-11-19 22:13:57 字数 546 浏览 1 评论 0 原文

我有一个很大的Set,其中包含许多单词,例如:

“aaa,cCc,dDD,AAA,bbB,BBB,AaA,CCc,...”

我想对集合中的所有重复单词进行分组,忽略单词的大小写敏感性,然后将它们保存在 Vector> 或其他内容中,因此每个Vector 项将包含一组相似的单词,如下所示:

Vector: aaa, AAA, AaA, ...

矢量cCc、CCc、...

矢量bbB、BBB、 ...

我关心性能,因为这个集合包含很多单词。

I have a large Set<String> that contains many words, say:

"aaa, cCc, dDD, AAA, bbB, BBB, AaA, CCc, ..."

I want to group all duplicate words from the Set ignoring the case sensitivity of the words then save them in a Vector<Vector<String>> or whatever, so each Vector<String> item will contain the group of similar words, like this :

Vector<String>: aaa, AAA, AaA, ...

Vector<String>: cCc, CCc, ...

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

I care about the performance as this Set contain many words.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一袭水袖舞倾城 2024-11-26 22:13:58

我将创建一个 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()

I would create a HashMap<String, Vector<String>> hashMap.
Next, for each 'string' in your set

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

At the end, create a Vector of vectors if needed, or work with the hashmap.valueSet()

失而复得 2024-11-26 22:13:58

如果您可以选择 Set 实现,则可以将 TreeSetComparator 一起使用,比较忽略大小写的字符串。然后您将能够迭代排序列表并轻松对重复项进行分组。

If you can choose Set implementation you can use TreeSet with Comparator that compares strings ignoring case. Then you will be able to iterate over sorted list and easily group duplicates.

烟雨凡馨 2024-11-26 22:13:58

这会迭代输入集一次,我怀疑您能否获得比这更快的速度。将 ArrayList 替换为 LinkedList 可能会以局部性换取更少的复制,这可能会提高性能,但我对此表示怀疑。这是代码:

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());

This iterates over the input set once and I doubt you can get much faster than that. Swapping the ArrayLists for LinkedLists may trade locality for less copying, which may be an performance gain, but I doubt it. Here's the code:

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());
归属感 2024-11-26 22:13:57

如果您真正关心性能,您就不会使用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);

If you truly care about performance you would not use Vector. As for the sorting problem one solution would be to use the TreeMap or TreeSet object and create a Comparator that does the equality (sorting) you want.

The instantiation could be:

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

   // comparator here

});

Usage:

LinkedList<String> entry = map.get(nextKey);
if (entry == null) {
  entry = new LinkedList<String>()
  map.put(nextKey, entry);
}
entry.add(nextKey);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文