有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从大型数据集中获取重复数据的最佳性能方法是什么?

我有一个大的Set<String>包含很多单词,比如:

“aaa,cCc,dDD,aaa,bbB,bbB,aaa,cCc,…”

我想对集合中的所有重复单词进行分组,忽略单词的大小写敏感度,然后将它们保存在Vector<Vector<String>>或其他文件中,这样每个Vector<String>项将包含类似单词的组,如下所示:

Vector<String>aaa,aaa,aaa

Vector<String>cCc,cCc

Vector<String>bbB,bbB

我关心的性能,因为这一套包含许多字


共 (4) 个答案

  1. # 1 楼答案

    这会在输入集上迭代一次,我怀疑你能得到比这快得多的速度。用ArrayList替换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());
    
  2. # 2 楼答案

    如果你真的关心性能,你就不会使用Vector。至于排序问题,一个解决方案是使用TreeMapTreeSet对象并创建一个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);
    
  3. # 3 楼答案

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

  4. # 4 楼答案

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