HashMap词典排序java如果值相同

时间:2016-11-19 08:32:38

标签: java sorting hashmap

我有以下<pre> <?php $pattern = '/(\˂[0-9a-z\s#-_="]*\˃((?>[^\˂\˃]+)|(?R))*(\˂\/[a-z]*\˃)?\s*)*/mx'; $subject = <<<EOT ˂div class="post"˃ ˂table˃ ˂tbody˃ ˂tr height="12"˃ ˂td˃˂/td˃ ˂td width="20" class="strip" rowspan="5"˃ ˂div class="follow unpublish"˃☆˂/div˃ ˂div class="follow report"˃⚐˂/div˃ ˂/td˃ ˂/tr˃ ˂/tbody˃ ˂/table˃ ˂/div˃ EOT; preg_match($pattern, $subject, $matches); print_r($matches); ?> </pre> ,根据使用HashMap<String,Integer>

的值,按降序排序
Comparator
  

Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Entry<String, Integer> entry1, Entry<String, Integer> entry2) { // TODO Auto-generated method stub return entry2.getValue().compareTo(entry1.getValue()); }

我现在想要按照字典顺序对此地图中的条目进行排序,仅当值相同时(在此示例中为值1)

b=3, cococ=2, 5005=1, p=1, sees=1, k=1, dad=1, pip=1, peep=1

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要使用双重标准对地图进行排序,首先检查密钥是否相同,然后按键排序......

public int compare(Entry<String, Integer> entry1, Entry<String, Integer> entry2) {
    int ret = entry2.getValue().compareTo(entry1.getValue());
    if (ret == 0) {// if 0 the are the same then compare the keys
        return entry1.getKey().compareTo(entry2.getKey());
    }
    return ret;
}

答案 1 :(得分:0)

使用java 8和比较器链接的简洁方法:

myMap.entrySet().stream()
                .sorted(Entry.<String, Integer>comparingByValue().reversed()
                .thenComparing(Entry::getKey))
                .collect(toList());

解释。我们基本上是在Set<Map.Entry<String, Integer>>中传输条目,然后使用comparingByValue()接口上方便的静态Entry方法对其进行排序,然后使用reversed()方法进行反转以获得降序。然后链接另一个比较器,它将使用thenComparing()方法进行第二级排序,这是Comparator接口上的一个默认方法,它返回一个字典顺序比较器并获取一个函数来提取排序键。我们提供了Entry::getKey作为参数的确切方法参考。

  

类型推断。我们必须在复合表达式中的comparingByValue()方法中添加额外的类型信息,以便   可以推断出thenComparing()方法的目标类型。如果   你不能在编译器无法提供的地方提供额外的类型信息   根据类型推断获取类型,您将收到编译器错误。

您的示例。您示例中的代码现在如下所示:

Map<String, Integer> myMap = new HashMap(){{ put("dad", 1); put("pip", 1); put("peep", 1); put("b", 3); put("cococ", 2); put("sees", 1); }};

List<Entry> sortedEntries = myMap.entrySet().stream()
                                     .sorted(Entry.<String, Integer>comparingByValue().reversed()
                                                  .thenComparing(Entry::getKey))
                                     .collect(toList());

System.out.print(sortedEntries);

首先从输入

开始
  

{b = 3,peep = 1,看见= 1,爸爸= 1,pip = 1,cococ = 2}

它将返回输出

  

[b = 3,cococ = 2,dad = 1,peep = 1,pip = 1,看= 1]