HOWTO · Java

Java で順序付きマップを作成する

この記事では、Java で順序付きマップを作成する方法を紹介します。

マップは、キーと値のペアを格納する Java のデータ構造です。マップは、コレクション階層に存在するインターフェースです。これらのキーは一意であるため、重複するキーは許可されていません。ただし、キーにマップされた変数の値が重複する可能性があります。HashMapLinkedHashMapTreeMap などのクラスは、Map インターフェースを実装します。

Java の TreeMap クラスを使用してマップを並べ替える

以下に、プログラムは Java プログラムでのマップの順序を示します。

import java.util.TreeMap;

public class Main {
  public static void main(String[] args) {
    TreeMap<String, Integer> map = new TreeMap<String, Integer>();
    map.put("Third", 1);
    map.put("First", 2);
    map.put("Second", 3);

    for (String key : map.keySet()) {
      System.out.println(key + " ,ID = " + map.get(key));
    }
  }
}

TreeMap クラスは、マップ値を昇順で並べ替えます。また、SortedMap インターフェースを内部的に実装しているため、新しいキーワードを使用してマップインスタンスが作成されます。

ツリーマップ内のデータ型は、インスタンス化時に指定されます。Map キーは String タイプであり、その値は Integer タイプです。

put 関数は、キーと値のペアをツリーマップに挿入します。これで、for-each ループが定義され、マップを反復処理します。Java では、マップ上で直接反復することはできません。したがって、マップのキーは最初に Set インスタンスに変換されます。

map.keySet 関数は、マップに存在するキーのセットを返します。この関数は TreeMap クラスにあり、存在するキーの順序付けられたビューを返します。get 関数は、キーに対応する値を取得します。

以下は昇順の出力です。

First, ID = 2 Second, ID = 3 Third, ID = 1

Java 8 関数を使用してマップの順序を作成する

Java 8 は、ユーザーが一連の関数を操作できるようにする関数型プログラミングのサポートを提供します。

Streams は、java.util パッケージのインターフェースであり、単一のステートメントで順次操作を簡単に処理できます。Streams 関数は、エミッターがデータを送信するパイプラインで機能します。ユーザーのニーズに応じて、フィルタリング、処理、変換などが行われます。

package F09;

import static java.util.AbstractMap.SimpleEntry;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class MapOrdering {
  public static void main(String[] args) {
    Map<String, String> mapSortedByKey =
        Stream
            .of(new SimpleEntry<>("key3", "value1"), new SimpleEntry<>("key1", "value2"),
                new SimpleEntry<>("key2", "value3"))
            .sorted(Map.Entry.comparingByKey())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                (oldVal, newValue) -> oldVal, LinkedHashMap::new));

    System.out.println();
    System.out.print("Ordered List: ");
    for (String s1 : mapSortedByKey.keySet()) {
      System.out.print(" " + s1);
    }
  }
}

Stream インターフェースはさまざまな機能を提供し、それらを処理するためにさまざまなクラスでその実装を取得します。ここで、キーと値のペアのストリームは、new SimpleEntry クラスを使用して形成されます。値は of 関数に挿入されてストリームを形成します。

チェーンシリーズでは、sorted 関数が呼び出されます。この関数は、Comparator インスタンスを使用して、定義された順序に従ってキーを順番に配置します。関数 comparingByKey は、キーを自然な昇順で比較するコンパレータを返します。

sorted 関数は、最終的に昇順で配置された値のストリームを返します。Stream クラスの collect 関数は、指定されたマップ値を新しい LinkedHashMap インスタンスに収集します。クラスは、提供されたシーケンスの挿入順序を保持します。この関数は、Collector インスタンスをパラメーターとして受け取ります。

最初のパラメーターは、新しいコンテナーを作成するサプライヤーの toMap 関数です。2 番目のパラメーターは値を累積する BiConsumer であり、最後のパラメーターは結果をマージするコンバイナーとして機能する BiConsumer です。したがって、LinkedHashMap::new コマンドは結果を結合し、形成されたインスタンスを返します。

mapSortedByKey インスタンスは、上記の for-each ループを使用して繰り返されるシーケンシャルマップ要素を保持するようになりました。結果のマップキーは、以下の標準出力に出力されます。

Ordered List : key1 key2 key3