JAvaでのMapの値順
11782 ワード
多くの場合、Mapをソートする必要があります.ソートの根拠はMapの値です.簡単な例としては、例えば
ソリューションは次のとおりです.
Comparatorの実装は次のとおりです.
LinkedHashMapは、挿入順序に関連する(Insertion-Order)順序によって、このスキームの効率が比較的低い双方向チェーンテーブルを維持している.次に、TreeMapを使用してソートを実装する例を示します.TreeMapはキーをソートし、カスタムコンパレータComparatorを受け入れることができます.
keyのコンパレータを実装する場合、値に基づいてソートしたいため、その順序は値に依存するため、コンパレータ構造の場合、ソートするMapを入力する必要があります.
上記のコードは特定のタイプのMapしか処理できません.以下では汎用的な方法を実現します.
(完)
Map
によって学生の点数を表し、そのMapを点数の高さから低さまで並べたい.より複雑な例では、Map>
は共有便のグループを表し、keyは共有便番号であり、valueはこの便番号を共有するすべての便であり、その中でパイロット便は最初の要素に位置しており、私たちは今、パイロット便の時間に基づいてソートしたいと考えています.ソリューションは次のとおりです.
private LinkedHashMap> sortHashMapByValues(
Map> passedMap , Comparator> comparator) {
List mapKeys = new ArrayList<>(passedMap.keySet());
List> mapValues = new ArrayList<>(
passedMap.values());
Collections.sort(mapValues, comparator);
Collections.sort(mapKeys);
LinkedHashMap> sortedMap = new LinkedHashMap<>();
Iterator> valueIt = mapValues.iterator();
while (valueIt.hasNext()) {
List val = valueIt.next();
Iterator keyIt = mapKeys.iterator();
while (keyIt.hasNext()) {
String key = keyIt.next();
List comp1 = passedMap.get(key);
List comp2 = val;
if (comp1.equals(comp2)) {
keyIt.remove();
sortedMap.put(key, val);
break;
}
}
}
return sortedMap;
}
Comparatorの実装は次のとおりです.
public class RTFlightArrivalComparator implements
Comparator<List<Flight>> {
@Override
public int compare(List o1,
List o2) {
Flight first1 = o1.get(0);
Flight first2 = o2.get(0);
return first1.getSta().compareTo(first2.getSta());
}
}
LinkedHashMapは、挿入順序に関連する(Insertion-Order)順序によって、このスキームの効率が比較的低い双方向チェーンテーブルを維持している.次に、TreeMapを使用してソートを実装する例を示します.TreeMapはキーをソートし、カスタムコンパレータComparatorを受け入れることができます.
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;
public class SortMapByValue {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("a", 10);
map.put("b", 30);
map.put("c", 50);
map.put("d", 40);
map.put("e", 20);
System.out.println(map);
TreeMap sortedMap = sortMapByValue(map);
System.out.println(sortedMap);
}
public static TreeMap sortMapByValue(HashMap map){
Comparator comparator = new ValueComparator(map);
//TreeMap is a map sorted by its keys.
//The comparator is used to sort the TreeMap by keys.
TreeMap result = new TreeMap(comparator);
result.putAll(map);
return result;
}
}
keyのコンパレータを実装する場合、値に基づいてソートしたいため、その順序は値に依存するため、コンパレータ構造の場合、ソートするMapを入力する必要があります.
// a comparator that compares Strings
class ValueComparator implements Comparator{
HashMap map = new HashMap();
public ValueComparator(HashMap map){
this.map.putAll(map);
}
@Override
public int compare(String s1, String s2) {
if(map.get(s1) >= map.get(s2)){
return -1;
}else{
return 1;
}
}
}
上記のコードは特定のタイプのMapしか処理できません.以下では汎用的な方法を実現します.
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class Solution {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("a", 10);
map.put("b", 30);
map.put("c", 50);
map.put("d", 40);
map.put("e", 20);
System.out.println(map);
Map sortedMap = sortByValue(map);
System.out.println(sortedMap);
}
public static Map sortByValue(Map unsortedMap) {
Map sortedMap = new TreeMap(new ValueComparator(unsortedMap));
sortedMap.putAll(unsortedMap);
return sortedMap;
}
}
class ValueComparator implements Comparator {
Map map;
public ValueComparator(Map map) {
this.map = map;
}
public int compare(Object keyA, Object keyB) {
Comparable valueA = (Comparable) map.get(keyA);
Comparable valueB = (Comparable) map.get(keyB);
return valueB.compareTo(valueA);
}
}
// a comparator using generic type
class ValueComparator> implements Comparator{
HashMap map = new HashMap();
public ValueComparator(HashMap map){
this.map.putAll(map);
}
@Override
public int compare(K s1, K s2) {
return -map.get(s1).compareTo(map.get(s2));//descending order
}
}
public class SortMapByValue {
public static void main(String[] args) {
// Map
HashMap map = new HashMap();
map.put("a", 10);
map.put("b", 30);
map.put("c", 50);
map.put("d", 40);
map.put("e", 20);
System.out.println(map);
Comparator comparator = new ValueComparator(map);
TreeMap result = new TreeMap(comparator);
result.putAll(map);
System.out.println(result);
// Map
HashMap map2 = new HashMap();
map2.put(1, 10);
map2.put(2, 30);
map2.put(3, 50);
map2.put(4, 40);
map2.put(5, 20);
System.out.println(map2);
Comparator comparator2 = new ValueComparator(map2);
TreeMap result2 = new TreeMap(comparator2);
result2.putAll(map2);
System.out.println(result2);
}
}
(完)