【问题标题】:Merge Sorting HashTable pairs based on String key基于字符串键合并排序哈希表对
【发布时间】:2015-04-22 21:14:52
【问题描述】:

我正在编写一个程序来计算文本文件中出现的单词,然后按字母顺序打印它们。我的计数部分工作正常,但我需要使用合并排序来按字母顺序排列单词。为此,我编写了以下方法:

public static HashPair<String, Integer>[] mergeSort(HashPair<String, Integer>[] data)
    {
        HashPair<String, Integer>[] sortedData = null;
        if (data.length >= 2) {
            HashPair<String, Integer>[] left = new HashPair[data.length / 2];
            HashPair<String, Integer>[] right = new HashPair[data.length - data.length / 2];

            for (int i = 0; i < left.length; i++) {
                if(data[i] != null)
                {
                    left[i] = data[i];
                }
            }

            for (int i = 0; i < right.length; i++) {
                if(data[i + data.length / 2] != null)
                {
                    right[i] = data[i + data.length / 2];
                }
            }

            mergeSort(left);
            mergeSort(right);
            sortedData = merge(data, left, right);
        }
        return sortedData;
    }

    /**
     * Helper method to merge the data back into one array
     * Based on code found at: http://stackoverflow.com/questions/20795158/sorting-names-using-merge-sort
     * 
     * @param names
     * @param left
     * @param right
     */
    public static HashPair<String, Integer>[] merge(HashPair<String, Integer>[] data, HashPair<String, Integer>[] left, HashPair<String, Integer>[] right) 
    {
        int a = 0;
        int b = 0;
        for (int i = 0; i < data.length; i++) 
        {
            try
            {
                if (b >= right.length || (a < left.length && left[a].getFirst().compareToIgnoreCase(right[b].getFirst()) < 0)) 
                {
                    data[i] = left[a];
                    a++;
                } 
                else 
                {
                    data[i] = right[b];
                    b++;
                }
            }
            catch(NullPointerException e)
            {
                continue;
            }
        }
        return data;
    }

要在 main 中调用这些方法并打印出表格,我使用以下 3 行

HashPair<String, Integer>[] unsortedData = wordTable.getData(); //Getting unsorted data to be sorted
HashPair<String, Integer>[] sortedData = mergeSort(unsortedData);
HashTable<String, Integer> sortedWordTable = new HashTable(sortedData);
sortedWordTable.dump(); //Printing all the words found with their respective counts

但是,这些单词打印时没有按字母顺序排列,就好像排序从未运行过,我不知道为什么

【问题讨论】:

    标签: java sorting hashtable


    【解决方案1】:

    您可以使用 TreeMap 代替 HashTable;在这种情况下,单词已经被排序。每次遇到新单词时,您都可以使用代码:

      if(!map.containsKey(word)) map.put(word,0);
      map.put(word, map.get(word)+1);
    

    【讨论】:

      【解决方案2】:

      当您创建一个以 sortedData 作为参数的新 HashTable 时,它​​们不会按顺序排列。 HashTables 用于提高效率而不是排序。添加元素时,它们基本上以随机顺序散列到表中。

      找到一种与 HashTable 不同的方式来保存已排序的数据。就像一个数组列表。

      【讨论】:

      • 没问题。哈希表很时髦。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      相关资源
      最近更新 更多