Java でマップを値で並べ替える方法
-
Java の
sort()
メソッドを用いたMap<key, value>
のソート -
Java における
sorted()
メソッドを用いたMap<key, value>
のソート -
Java の
Comparator
を用いたsort()
メソッドによるMap<key, value>
のソート -
Java の
sorted()
とtoMap()
メソッドを用いたMap<key, value>
のソート -
Java のカスタムコードを用いた
Map<key, value>
のソート
このチュートリアルでは、Java での Map<key, value>
を値で並べ替える方法と、それを理解するためのコード例を紹介します。
Map<key, value>
をソートする方法はいくつかあります。ここでは、sort()
、sorted()
メソッドやコンパレータインタフェースなどを利用します。例を見てみましょう。
Java の sort()
メソッドを用いた Map<key, value>
のソート
Map の要素をソートするには、List
インターフェースの sort()
メソッドを用いることができます。sort()
メソッドは要素を昇順にソートしますが、値によるソートは comparingByValue()
メソッドを用いて指定します。以下の例を参照してください。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SimpleTesting {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>();
map.put(2, 1020);
map.put(3, 300);
map.put(1, 100);
map.put(5, 500);
map.forEach((k, v) -> System.out.println(k + "=" + v));
System.out.println("After Sorting by value");
List<Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
list.sort(Entry.comparingByValue());
list.forEach(System.out::println);
}
}
出力:
1=100
2=1020
3=300
5=500
After Sorting
1=100
3=300
5=500
2=1020
Java における sorted()
メソッドを用いた Map<key, value>
のソート
ストリームを扱う場合は、昇順に要素をソートする sorted()
メソッドを用いることができます。sorted()
メソッドの引数に Map.Entry.comparisonByValue()
を渡すと、Map<key, value>
を値でソートすることができます。
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public class SimpleTesting {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>();
map.put(2, 1020);
map.put(3, 300);
map.put(1, 100);
map.put(5, 500);
map.forEach((k, v) -> System.out.println(k + "=" + v));
System.out.println("After Sorting by value");
Stream<Map.Entry<Integer, Integer>> sorted =
map.entrySet().stream().sorted(Map.Entry.comparingByValue());
sorted.forEach(System.out::println);
}
}
出力:
1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020
Java の Comparator
を用いた sort()
メソッドによる Map<key, value>
のソート
この例では、sort()
メソッド内の Map<key, value>
の値を比較するために compareTo()
メソッドを引数に用いています。この例では、Comparator
インターフェースの匿名の内部クラスを作成し、compare()
メソッドを定義して値を比較しています。
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SimpleTesting {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>();
map.put(2, 1020);
map.put(3, 300);
map.put(1, 100);
map.put(5, 500);
map.forEach((k, v) -> System.out.println(k + "=" + v));
System.out.println("After Sorting by value");
List<Entry<Integer, Integer>> list = new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Object>() {
@SuppressWarnings("unchecked")
public int compare(Object o1, Object o2) {
return ((Comparable<Integer>) ((Map.Entry<Integer, Integer>) (o1)).getValue())
.compareTo(((Map.Entry<Integer, Integer>) (o2)).getValue());
}
});
Map<Integer, Integer> result = new LinkedHashMap<>();
for (Iterator<Entry<Integer, Integer>> it = list.iterator(); it.hasNext();) {
Map.Entry<Integer, Integer> entry = (Map.Entry<Integer, Integer>) it.next();
result.put(entry.getKey(), entry.getValue());
}
result.forEach((k, v) -> System.out.println(k + "=" + v));
}
}
出力:
1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020
Java の sorted()
と toMap()
メソッドを用いた Map<key, value>
のソート
この例では、sorted()
メソッドを用いて Map<key, value>
をソートし、その結果を toMap()
メソッドを用いて LinkedHashMap
に収集しています。ここでは、メソッド参照の概念を利用して LinkedHashMap
オブジェクトを作成しています。
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>();
map.put(2, 1020);
map.put(3, 300);
map.put(1, 100);
map.put(5, 500);
map.forEach((k, v) -> System.out.println(k + "=" + v));
System.out.println("After Sorting by value");
Map<Integer, Integer> result = map.entrySet()
.stream()
.sorted(Entry.comparingByValue())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));
result.forEach((k, v) -> System.out.println(k + "=" + v));
}
}
出力:
1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020
Java のカスタムコードを用いた Map<key, value>
のソート
ここでは、Comparator
インターフェースを実装したユーザ定義クラスを作成し、そのオブジェクトを TreeMap
に渡して Map<key, value>
の値によるソートを行います。
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
class UserComparator implements Comparator<Object> {
Map<Integer, Integer> map;
public UserComparator(Map<Integer, Integer> map) {
this.map = map;
}
public int compare(Object o1, Object o2) {
if (map.get(o2) == map.get(o1))
return 1;
else
return ((Integer) map.get(o1)).compareTo((Integer) map.get(o2));
}
}
public class SimpleTesting {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>();
map.put(2, 1020);
map.put(3, 300);
map.put(1, 100);
map.put(5, 500);
map.forEach((k, v) -> System.out.println(k + "=" + v));
System.out.println("After Sorting by value");
UserComparator comparator = new UserComparator(map);
Map<Integer, Integer> result = new TreeMap<Integer, Integer>(comparator);
result.putAll(map);
result.forEach((k, v) -> System.out.println(k + "=" + v));
}
}
出力:
1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020