如何自定义 TreeMap 以按降序对键进行排序?
How to Customize a TreeMap to sort keys in descending order?
我有一段代码试图按降序对 TreeMap
中的键进行排序,因为当我只使用 TreeMap
时,它会根据键进行排序,这些键是按升序排列。我得到的错误是:
No Suitable Constructor found for 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());
}
}
}
试试这个:
Comparator<Double> comparator = Double::compare;
Comparator<Double> reverseComparator = comparator.reversed();
Map<Double,Integer> reversedMap = new TreeMap(reverseComparator);
您的比较器类型是 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<>()
,就像我在上面的代码片段中所做的那样。查看 Josh Bloch 的精彩著作 Effective Java 2nd Ed.(第 4 章与此处相关)以获得关于 Java 的重要建议。
我有一段代码试图按降序对 TreeMap
中的键进行排序,因为当我只使用 TreeMap
时,它会根据键进行排序,这些键是按升序排列。我得到的错误是:
No Suitable Constructor found for 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());
}
}
}
试试这个:
Comparator<Double> comparator = Double::compare;
Comparator<Double> reverseComparator = comparator.reversed();
Map<Double,Integer> reversedMap = new TreeMap(reverseComparator);
您的比较器类型是 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<>()
,就像我在上面的代码片段中所做的那样。查看 Josh Bloch 的精彩著作 Effective Java 2nd Ed.(第 4 章与此处相关)以获得关于 Java 的重要建议。