在Java中,根据key.length()对哈希图进行排序。

问题描述 投票:7回答:6

我有一个这样的哈希图。

HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("java",4);
map.put("go",2);
map.put("objective-c",11);
map.put("c#",2);

现在我想按键的长度对这个图进行排序,如果两个键的长度相等(例如go和c#都是2),那么就按alphba顺序排序,所以我希望得到的结果是这样的:

打印结果:Objective-c, 11java, 4c#, 2go, 2

这是我自己的attamp,但它根本无法工作......事实上,'compareTo'方法显示为红色(无法编译)......请有人帮我一些代码示例......我有点困惑如何使用比较器类来定制比较器。

      HashMap<String,Integer> map = new HashMap<String,Integer>();
          map.put("java",4);
          map.put("go",2);
          map.put("objective-c",11);
          map.put("c#",2);

      Map<String,Integer> treeMap = new TreeMap<String, Integer>(
                new Comparator<String>() {
                    @Override
                    public int compare(String s1, String s2) {
                        return s1.length().compareTo(s2.length());
                    }
                }
        );

实际上'compareTo'方法显示为红色(无法编译)......请谁能帮我提供一些代码示例......我对如何使用比较器类自定义比较对象有点困惑......。

java sorting hashmap comparator treemap
6个回答
15
投票

编译器在抱怨,因为你不能调用 "go",2; map.put("objective-c",11); map.put("c#",2); 现在我想...。compareTo 关于 int. 正确的排序方式是: 。

Map<String, Integer> treeMap = new TreeMap<String, Integer>(
    new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            if (s1.length() > s2.length()) {
                return -1;
            } else if (s1.length() < s2.length()) {
                return 1;
            } else {
                return s1.compareTo(s2);
            }
        }
});

前两个条件是比较两幅地图的长度 String并相应返回一个正数或负数。第三个条件是比较 String如果它们的长度相等,则在词法上称为 "s"。


6
投票

你把 String#length(),它返回一个原始的 int. 你需要静态方法 Integer.compare(int,int). 如果你是在Java 8上,你可以省去很多打字的工作。

Map<String,Integer> treeMap = new TreeMap<>(
        Comparator.comparingInt(String::length)
                  .thenComparing(Function.identity()));

2
投票
public int compare(String o1, String o2) {
  return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length();
}

1
投票

因为 length() 不定义 compareTo 方法,这就是为什么你会看到错误。要纠正它,请使用 Integer.compare(s1.length(), s2.length()); 更新代码如下

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Test {

    public static void main(String[] args) {

        HashMap<String,Integer> map = new HashMap<String,Integer>();
        map.put("java",4);
        map.put("go",2);
        map.put("objective-c",11);
        map.put("c#",2);


        Map<String,Integer> treeMap = new TreeMap<String, Integer>(
                new Comparator<String>() {
                    @Override
                    public int compare(String s1, String s2) {
                        return Integer.compare(s1.length(), s2.length());
                    }
                }
        );

        treeMap.putAll(map);

        System.out.println(treeMap);
    }
}

1
投票

如果使用 树图非强制性

解释: 定义: Comaprator ,下一步,定义一个列表,这样我们就可以把所有地图条目添加到一个列表中。最后,将列表按定义的 Comaprator

编码:

 Comparator<Map.Entry<String,Integer>> byMapValues = 
         (Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) ->left.getValue().compareTo(right.getValue());

 List<Map.Entry<String,Integer>> list = new ArrayList<>();
 list.addAll(map.entrySet());
 Collections.sort(list, byMapValues);
 list.forEach( i -> System.out.println(i));

产出:

c#=2
go=2
java=4
objective-c=11

注意事项 按数量排序

如果需要根据键进行比较,可以使用以下一行。

Comparator<Map.Entry<String,Integer>> byMapKeys = 
             (Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) -> left.getKey().compareTo(right.getKey());

-2
投票

比较器应该是:

new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.