Java Spring Comparator для TreeMap - PullRequest
1 голос
/ 28 июня 2019

Я пытался использовать SortedMap с настроенным компаратором в одном из моих весенних проектов.Это SortedMap, где я пытаюсь отсортировать по второй половине строки (которая является ключом).Пример ключа «А: 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

Однако, когда мое приложение вызывает Result, оно выводит:

A:10000
A:200
A:500

, чтопорядок символов.Поэтому мне интересно, сделал ли я что-то не так, поместив компаратор в определение класса.

1 Ответ

2 голосов
/ 28 июня 2019

Ваш синтаксис неверен. Способ сделать это с лямбдами:

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) определенно лучший из трех. Обратите внимание, что вы можете связать (представлять: сортировать сначала по этой вещи, и если они одинаковы, то по этой вещи, но наоборот: вы можете сделать это).

...