2016-04-09 2 views
0

У меня есть часть кода, с которой я пытаюсь сортировать ключи в TreeMap в порядке убывания, потому что, когда я просто использую TreeMap, он сортируется на основе ключей, которые находятся в порядке возрастания. Я получаю сообщение об ошибке:Как настроить TreeMap для сортировки ключей в порядке убывания?

Не найдено подходящего конструктора для TreeMap.

Что здесь не так?

import java.util.TreeMap; 
import java.util.Map; 
import java.util.Comparator; 
import java.util.Map.Entry; 
import java.util.SortedMap; 

public class ChangeMachine { 


    public TreeMap<Double, Integer> dispenseChange(Double changeAmount, TreeMap<Double, Integer> coinsMap) { 
     TreeMap<Double, Integer> coinDispenserMap = new TreeMap<>(); 
     for (Map.Entry<Double, Integer> coin : coinsMap.entrySet()) { 
      if (!(changeAmount > coin.getKey())) { 
       coinDispenserMap.put(coin.getKey(), 0); 
       continue; 
      } 
      int noOfCoins = (int) (changeAmount/coin.getKey()); 
      coinDispenserMap.put(coin.getKey(), noOfCoins); 
      Double remainder = changeAmount % coin.getKey(); 
      changeAmount = remainder; 
      if (changeAmount == 0.0) { 
       break; 
      } 
     } 
     return coinDispenserMap; 

    } 


    public static void main(String[] args) { 
     ChangeMachine ref = new ChangeMachine(); 
     TreeMap<Double, Integer> coinsMap = new TreeMap<Double, Integer>(new Comparator<Entry<Double, Integer>>() { 
      public int compare(Entry<Double, Integer> coin1, Entry<Double, Integer> coin2) { 
       return (coin2.getKey().compareTo(coin1.getKey())); 
      } 
     }); 
     coinsMap.put(0.25, 10); 
     coinsMap.put(0.01, 10); 
     coinsMap.put(0.05, 10); 
     coinsMap.put(0.10, 10); 

     TreeMap<Double, Integer> coinDispenserMap = ref.dispenseChange(0.86, coinsMap); 

     for (Map.Entry<Double, Integer> coin : coinDispenserMap.entrySet()) { 
      System.out.println(coin.getKey() + " : " + coin.getValue()); 
     } 
    } 
} 
+0

Вам нужно сравнить 'Double', а не '>' –

+0

Спасибо. Оно работает!! – Sekhar

ответ

2

вашего компаратора является Entry<Double, Integer>, который должен быть супер-типом ключа типа карты, которая является Double. Поскольку Entry<Double, Integer> не является супертипом Double, то constructor can't be matched.

Вместо этого попробуйте:

Map<Double, Integer> coinsMap = 
    new TreeMap<Double, Integer>(new Comparator<Double>() { 
     public int compare(Double coin1, Double coin2) { 
      return (coin2.compareTo(coin1)); 
     } 
    }); 

Кроме того, для немного стиля, вы можете рассмотреть вопрос об объявлении coinsMap в Map<Double, Integer> coinsMap = new TreeMap<>(), как я сделал в фрагменте кода выше. Ознакомьтесь с замечательной книгой Джоша Блоха Effective Java 2nd Ed. (глава 4 здесь применима) для отличных советов по Java.

+0

Спасибо за предложение !! – Sekhar

4

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

Comparator<Double> comparator = Double::compare; 
Comparator<Double> reverseComparator = comparator.reversed(); 
Map<Double,Integer> reversedMap = new TreeMap(reverseComparator); 
Смежные вопросы