Печать отсортированной карты дерева (отсортирована по значениям)

У меня есть отсортированная TreeMap на основе значений, и она напечатана, как показано ниже:

abortion-2
able-2
ab-2
aaron-2
aaa-2
aa-2
a-2
absent-1
absence-1
abraham-1
ability-1
aberdeen-1
abc-1

Но кажется, что слова с одинаковыми значениями печатаются в обратном порядке:

"аборт, способный, аб, аарон, ааа, аа, а" вместо "а, аа, ааа, аарон, аб, способный аборт " и так далее.

Я даже думал добавить каждый набор ключей, имеющих одинаковое значение, в TreeSet и распечатать его, но я не мог повторить его на основе следующих значений.

Вот компаратор, который я передаю в TreeMap. Может ли кто-нибудь помочь мне исправить код, чтобы напечатать его в правильном порядке?

 public class MyComparator implements Comparator<String>{
    Map<String, Integer> tiedMap; 

    public MyComparator(Map<String, Integer> map){
       this.tiedMap = map; 
    }        

    public int compare(String a, String b){
        if(tiedMap.get(a)>=tiedMap.get(b)){
            return -1;
        }
        else
            return 1;
    }
}

И вот как я пытаюсь его напечатать:

Iterator it = tree.entrySet().iterator();
for(int i=0; i<n; i++){
   if(it.hasNext()){
      Map.Entry pairs = (Map.Entry)it.next();
      System.out.println(pairs.getKey()+"-"+pairs.getValue());
   }
}

Изменить: я читаю ввод в TreeMap, а затем передаю его в другой TreeMap.

Изменить: код, который создает TreeMaps:

Map<String, Integer> map = new TreeMap<String, Integer>();        
Words t = new Words();         
MyComparator comp = w.(new MyComparator(map));       
Map<String, Integer> tree = new TreeMap<String, Integer>(comp); 

int size = Integer.parseInt(buffer.readLine());
   for(int i = size; i>0; i--){
       reader = buffer.readLine();
       if(map.get(reader)!=null){
          map.put(reader, map.get(reader)+1);
       }
       else
          map.put(reader, 1);                
   }
tree.putAll(map);      

person Crocode    schedule 31.01.2013    source источник
comment
Можете ли вы включить строки кода, которые создают оба TreeMaps, пожалуйста?   -  person SimonC    schedule 31.01.2013
comment
TreeMap не может иметь повторяющихся ключей (в вашем случае ключ - это то, что возвращает метод сравнения).   -  person dacwe    schedule 31.01.2013


Ответы (4)


Ваш компаратор вернет записи, отсортированные в обратном порядке, основываясь только на их значении. Это то, что вы хотите?

Кроме того, если вы хотите, чтобы записи были в более предсказуемом порядке, вы также должны сравнить ключи:

public int compare(String a, String b)
{
    Integer aVal = tiedMap.get(a);
    Integer bVal = tiedMap.get(b);

    if (aVal > bVal)
    {
        return 1; // or -1 for descending order
    }
    else if (aVal < bVal)
    {
        return -1; // or 1 for descending order
    }
    else
    {
        // if values are equivalent compare on key as well
        return a.compareTo(b);
        // or for descending order:
        // return b.compareTo(a);
    }
}
person SimonC    schedule 31.01.2013
comment
Переход на возврат 1 помогает вместо возврата 0, когда они равны. Раньше я возвращал -1. - person Crocode; 31.01.2013
comment
Вы на самом деле должны вернуть 0, если они равны (и еще 1 или -1 для больше/меньше). - person SimonC; 31.01.2013

if(tiedMap.get(a)>=tiedMap.get(b)){
    return -1;
}
else
    return 1;

Вы должны изменить свой код, чтобы он возвращал 0, когда значения совпадают. Это гарантирует, что относительный порядок между вашими исходными ключами не изменится. Если это не работает, вы можете добавить дополнительный код, например:

if (tiedMap.get(a) == tiedMap.get(b))
  return a.compareTo(b);
person Ashwinee K Jha    schedule 31.01.2013
comment
Код работает, когда я return 1 вместо 0, когда они равны. - person Crocode; 31.01.2013
comment
Ну, это может работать в вашей текущей входной последовательности, но не всегда. Вы должны явно выбрать, хотите ли вы, чтобы относительный порядок ключей (когда значения одинаковы) сортировались, или вы хотите, чтобы они были такими же, как ввод, т.е. оставить относительный порядок ключей неизменным. - person Ashwinee K Jha; 31.01.2013

На самом деле, используя компаратор, вы можете сортировать HashMap, TreeMap как по возрастанию, так и по убыванию.

Попробуйте это:

// sort list based on comparator
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {
            return ((Comparable) ((Map.Entry) (o2)).getValue())
                                   .compareTo(((Map.Entry) (o1)).getValue());
        }
    });

Это даст вывод в порядке убывания. К interchanging the o2 and o1 only вы отсортируете их по возрастанию.

person Ravi A    schedule 31.01.2013

Я не уверен, что полностью понимаю ваше ожидание/реализацию, но я думаю, что вам нужно сравнить символы между строками a и b в функции сравнения.

person Saurabh    schedule 31.01.2013
comment
ОП просит сортировать по значению, а не по ключу. - person SimonC; 31.01.2013
comment
моя вина. Я был немного смущен, и именно поэтому я упомянул об этом в своем первом предложении. - person Saurabh; 01.02.2013