Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】TreeMapを使ってユーザー定義オブジェクトを年齢順にソートする方法


Javaでユーザー定義オブジェクト(例:名前と年齢の組み合わせ)をソートしたい場合、TreeMapを活用すると簡単に実現できます。TreeMapはキーを自動的に昇順に並べ替える特性を持つため、年齢などの数値をキーにすれば、データを効率よく整理できます。

サンプルコード

import java.io.*;
import java.util.*;
public class Demo{
   static void sort_objects(String my_data){
      String[] my_vals = my_data.split(" ");
      Map<Integer, ArrayList<String> > my_map = new TreeMap<>();
      for (int i = 1; i < my_vals.length; i += 2){
         int my_age = Integer.parseInt(my_vals[i]);
         String name = my_vals[i - 1];
         if (my_map.containsKey(my_age)){
            ArrayList<String> my_list = my_map.get(my_age);
            my_list.add(name);
            Collections.sort(my_list);
            my_map.remove(my_age);
            my_map.put(my_age, my_list);
         }
         else{
            ArrayList<String> my_list = new ArrayList<>();
            my_list.add(name);
            my_map.put(my_age, my_list);
         }
      }
      for (Map.Entry<Integer, ArrayList<String> > entry : my_map.entrySet()){
         ArrayList<String> al1 = entry.getValue();
         for (int i = 0; i < al1.size(); i++)
         System.out.print(al1.get(i) + " " + entry.getKey() + " ");
      }
   }
   public static void main(String args[]){
      String my_obj = "Joe 36 Hannah 24 Jill 13 Jack 1 Preet 8 Deep 45";
      System.out.println("The objects after sorting are : ");
      sort_objects(my_obj);
   }
}

実行結果

The objects after sorting are :
Jack 1 Preet 8 Jill 13 Hannah 24 Joe 36 Deep 45

コードの解説

「Demo」クラス内の「sort_objects」メソッドは、整数型のキー(年齢)と文字列のArrayList(名前)を対応付けるTreeMapを生成します。入力文字列を空白で分割した後、2つずつペアとして読み込み、偶数番目の要素を名前、直後の要素を年齢として処理していきます。

すでに同じ年齢のキーがマップに存在する場合は、該当するリストに名前を追加し、Collections.sort()によってアルファベット順に整列させてからマップを更新します。存在しない場合は、新しいArrayListを作成して名前を登録します。

すべてのデータを登録し終えたら、entrySet()でマップを走査します。このときTreeMapによって年齢がすでに昇順に並んでいるため、名前と年齢を順に出力するだけでソート済みの結果が得られます。

mainメソッドでは、「Joe 36 Hannah 24 Jill 13 Jack 1 Preet 8 Deep 45」という形式の文字列オブジェクトを作成し、このメソッドを呼び出して結果をコンソールに表示しています。

TreeMapを使うメリット

  • TreeMapは内部で赤黒木(Red-Black Tree)を採用しており、キーの自然順序や指定したComparatorに従って、常にソートされた状態で要素を保持します。
  • 要素の追加・検索・削除はいずれもO(log n)の時間計算量で処理できるため、大量のデータでも高いパフォーマンスを発揮します。
  • 同じキー(この例では同年齢)に複数の値を持たせたい場合、値としてArrayListを使うことで対応でき、さらにCollections.sort()を組み合わせれば同一年齢内での名前順ソートも可能です。
  1. JavaでGsonのカスタムインスタンスクリエーター(InstanceCreator)を使う方法

    JSON文字列をJavaオブジェクトへ変換する(またはその逆を行う)際、Gsonはデフォルトでデフォルトコンストラクタを呼び出してJavaクラスのインスタンスを生成します。しかし、対象となるJavaクラスにデフォルトコンストラクタが存在しない場合や、オブジェクト生成時に何らかの初期設定を行いたい場合には、独自のインスタンスクリエーターを作成してGsonに登録する必要があります。 Gsonでカスタムインスタンスクリエーターを作成するには、InstanceCreatorインターフェースを使用し、createInstance(Type type)メソッドを実装します。 構文 T createInst

  2. Javaで事前定義メソッドを使わずに文字列をソートする方法を解説

    JavaにおけるString(文字列)は、不変(immutable)な文字の連なりを表すオブジェクトであり、一度生成するとその内容を変更することはできません。文字列オブジェクトを扱う際には、java.lang.Stringクラスを使用します。本記事では、Arrays.sort()のようなソート用の事前定義メソッドに頼らずに、文字列内の文字をアルファベット順に並べ替える方法を紹介します。仕組みはシンプルで、隣り合う文字同士を比較しながら入れ替えていく「バブルソート」の考え方をそのまま応用しています。処理の流れtoCharArray()で文字列をchar型の配列に変換する二重ループですべての文字の