2016-04-09 9 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'sを比較する必要があります。 –

+0

ありがとうございます。できます!! – Sekhar

答えて

2

あなたのコンパレータのタイプがDoubleあるマップのキー型のスーパータイプであることが必要Entry<Double, Integer>です。 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)); 
     } 
    }); 

また、スタイルのビットのために、あなたは、私は上記のコードで行ったようにMap<Double, Integer> coinsMap = new TreeMap<>()としてcoinsMapを宣言する検討する必要があります。 Josh Blochの素晴らしい本であるEffective Java 2nd Ed.(第4章はここに関連しています)をチェックしてください。

+0

提案していただきありがとうございます! – Sekhar

4

これを試してみてください:

Comparator<Double> comparator = Double::compare; 
Comparator<Double> reverseComparator = comparator.reversed(); 
Map<Double,Integer> reversedMap = new TreeMap(reverseComparator); 
関連する問題