1

我试图SortedMap在我的一个春季项目中使用带有自定义比较器的比较器。这是一个 SortedMap,我尝试按字符串的后半部分(这是关键)进行排序。键“A:123”的示例。

我添加了一个自定义比较器,以确保 SortedMap 按整数顺序而不是字符串顺序。

这是一个简化的示例代码,我在里面有 SortedMap 的类:

class TestObject{
    private SortedMap<String, String> myMap = new TreeMap<String, String>({
            new Comparator<String>()
            {
                @Override
                public int compare(String s1, String s2)
                {
                       int m1 = Integer.parseInt(O1.split(":")[1]);
                       int m2 = Integer.parseInt(O2.split(":")[1]);
                       return m1- m2;
                } 
   });    
    void setMap(SortedMap<String, String> maps){
         myMap = maps;
    }    
    void getMap(){ return myMaps; }
}

在我的主要功能中,我做了:

class UpperClass{
  @Autowired
  TestObject object1;    
  public setNewMap(){
      SortedMap<String, String> myInput = new TreeMap<String, String>({
              //my comparator
      });
      myInput.put("A:10000", "XXX");
      myInput.put("A:500","XXX");
      myInput.put("A:200","XXX");
      object1.setMap(myInput);
 }
      pubic getResult(){
          SortedMap<String, String> result = object1.getMap();
      }    
}

所以我远程调试我的应用程序。似乎类定义中的比较器从未被调用过。我逐行打印,myInput 通过输出保持字符串的顺序:

A:200
A:500
A:10000

但是,当我的应用程序调用 get Result 时,它会打印出:

A:10000
A:200
A:500

这是字符顺序。所以我想知道我是否在类定义中放置了一个比较器做错了什么。

4

1 回答 1

2

你的语法不正确。使用 lambda 的方法:

new TreeMap<String, String>((a, b) -> a.length() - b.length());

使用 Comparator 的实用方法:

new TreeMap<String, String>(Comparator::comparingInt(String::length));

老式:

new TreeMap<String, String>(new Comparator<String>() {
    public int compare(String a, String b) {
        return a.length - b.length;
});

第二个(使用 Comparator 的实用程序)绝对是三个中最好的。注意你可以链接(表示:首先在这个东西上排序,如果它们相同,那么在这个东西上,但反过来:你可以这样做)。

于 2019-06-28T02:48:18.737 回答