排序地图的比较器

时间:2015-03-06 03:05:47

标签: java dictionary comparator

希望你做得好。我在实现比较器方法时遇到一些问题,无法通过其值对地图进行排序。我已经编写了比较器方法,现在我正在尝试编写一个方法,该方法将未排序的映射作为输入,并使用比较器实现来返回已排序的Map。但是,我的代码中的一行中存在错误,导致无法编译。我写的排序方法的代码如下:

public static HashMap<String,ArrayList<String>>strongSorter(HashMap<String,ArrayList<String>> unsortedMap) {

    MapComparator myCompare = new MapComparator(unsortedMap);
    HashMap<String,ArrayList<String>> sortedMap = new HashMap<String,ArrayList<String>>(myCompare);
    sortedMap.putAll(unsortedMap);
    return sortedMap;
}

错误出现在我尝试创建sortedMap的行中; Eclipse声明我不允许将myCompare作为参数传递,因为我输入的参数必须与HashMap<String, ArrayList<String>>的输入匹配。我不知道怎么解决这个问题,非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:3)

您无法排序HashMap。来自Javadoc(强调我的):

  

基于哈希表的Map接口实现。这个   实现提供了所有可选的map操作,以及   允许空值和空键。 (HashMap类大致是   相当于Hashtable,除了它是不同步的并允许   nulls。)此类不保证地图的顺序;   特别是,它不保证订单将保留   随着时间的推移不断。

如果您想在地图中订购,则应使用SortedMap,例如TreeMap。另请注意,TreepMap按键排序,因此您可能需要try another approach to this

您可以使用Map.Entry中的comparingByValue()方法在Java 8中执行此操作。下面是一个示例,它返回按地图值排序的Stream

public static Stream<Map.Entry<String, List<String>>> strongSorter(Map<String, List<String>> unsortedMap) {
    return unsortedMap.entrySet()
                      .stream()
                      .sorted(Map.Entry.comparingByValue(new MapComparator()));
}

答案 1 :(得分:0)

您可以将TreeMap用作有序地图并指定比较器。