TreeMap的Java Spring比较器

时间:2019-06-27 23:05:22

标签: java comparator spring-framework-beans

我试图在我的一个春季项目中使用带有自定义比较器的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

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

1 个答案:

答案 0 :(得分:2)

您的语法不正确。使用lambdas的方法:

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;
});

第二个(使用比较器的实用程序)绝对是三个中最好的。请注意,您可以链接(代表:首先对此事物进行排序,如果相同,则对这个事物进行排序,但反之:您可以这样做)。