java

HashMapを使う

Java 基本のKシリーズです。Javaを使う実務経験がないので本当に初歩的な事しか書いておりません事ご了承くださいませ、、

HashMapを使う

key、valueでデータを管理できます。特徴としてkeyは重複できません。以下例にもありますが同じkeyで書き込み(put)を行うと既存の値を上書きする事となり最後にPUTした値が残ります。また、存在しないkeyで削除(remove)してもエラーにはなりません。ループの方法はいくつかありますが、3つほど記載してみました。記載した順番にわかりやすいと思いますが、実行速度は真逆です。項目数を取得するならsize()で取得できるのですが、ループ回数毎に条件を指定するような場合には、別途ループ前に int i=0;と定義してループ中でi++;とカウントアップするしかないようです。
またこの時注意が必要なのは、出力される順番の指定ができない事です。もしデータ格納順を担保したまま利用したい場合はLinkedHashMap、Key項目でソートした状態を担保したい場合はTreeMapを使います。(Javaが得意でない私はこれらの存在につい最近気づきました。。。)

package sample001;
import java.util.HashMap;
import java.util.Map;
public class SampleMap01 {
	public static void main(String[] args) {
		Map<String,Integer> subject;
		subject = new HashMap<>();
		 
		subject.put("数学", 100);
		subject.put("英語", 82);
		subject.put("国都", 56);
		subject.put("数学", 90);

		System.out.println("--- [keySet()を使い1件づつKey検索] ---");
		for (String key : subject.keySet()) { 
			Integer values = subject.get(key); 
			System.out.println("Key : " + key + " value: " + values);
		}
		
		System.out.println("--- [Map.Entryを使う] ---");
		for (Map.Entry<String, Integer> entry : subject.entrySet()) {
			System.out.println("key: " + entry.getKey() + "  value: " + entry.getValue());
		}
		
		System.out.println("--- [forEachを使う] ---");
		subject.forEach( (key, value) -> {System.out.println("key: " + key + " value: " + value);});

		System.out.println("--- [削除の結果] ---");
		subject.remove("数学");
		subject.remove("社会");
		subject.remove("数学");
		subject.forEach( (key, value) -> {System.out.println("key: " + key + " value: " + value);});         
	}
}
実行結果
--- [keySet()を使い1件づつKey検索] ---
Key : 数学 value: 90
Key : 国都 value: 56
Key : 英語 value: 82
--- [Map.Entryを使う] ---
key: 数学  value: 90
key: 国都  value: 56
key: 英語  value: 82
--- [forEachを使う] ---
key: 数学 value: 90
key: 国都 value: 56
key: 英語 value: 82
--- [削除の結果] ---
key: 国都 value: 56
key: 英語 value: 82

Mapの中にMapを入れる

VALUEに相当するところをMapにして「Map< String,Map<String,Integer>> 」よく利用します。

package sample001;
import java.util.HashMap;
import java.util.Map;

public class SampleMap02 {
	public static void main(String[] args) {
		Map< String,Map<String,Integer>> sutudent = null;
		String student_name;
		SampleMap02 my = new SampleMap02();
		sutudent = new HashMap<>();
		student_name = "西川";
		sutudent.put(student_name,my.scoring(student_name));
		student_name = "南田";
		sutudent.put(student_name,my.scoring(student_name));
		student_name = "北山";
		sutudent.put(student_name,my.scoring(student_name));
		student_name = "東屋";
		sutudent.put(student_name,my.scoring(student_name));
		 for (Map.Entry<String, Map<String,Integer>> entry : sutudent.entrySet()) {
	          System.out.println("key: " + entry.getKey() + "  value: " + entry.getValue());
	     }
	}
	
	public Map<String,Integer> scoring(String name){
		Map<String,Integer> subject;
		subject  = new HashMap<>();
		if(name.equalsIgnoreCase("西川")) {
			subject.put("数学", 100);
			subject.put("英語", 82);
			subject.put("国都", 56);
		} else if (name.equalsIgnoreCase("南田")) {
			subject.put("数学", 70);
			subject.put("英語", 92);
			subject.put("国都", 86);
		} else if (name.equalsIgnoreCase("北山")) {
			subject.put("英語", 92);
			subject.put("国都", 86);
			subject.put("理科", 98);
		} else if (name.equalsIgnoreCase("東屋")) {
			subject.put("英語", 92);
			subject.put("国都", 86);
		}
		return subject;
	}
}
実行結果
key: 北山  value: {理科=98, 国都=86, 英語=92}
key: 南田  value: {数学=70, 国都=86, 英語=92}
key: 東屋  value: {国都=86, 英語=92}
key: 西川  value: {数学=100, 国都=56, 英語=82}

ArrayListに入れて使う

インデックスでのアクセスを実現するためにArrayListと組み合わせます。

package sample001;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class SampleMap03 {

	public static void main(String[] args) {
		ArrayList<Map<String,Integer>> sutudent = null;
		String student_name;
		SampleMap03 my = new SampleMap03();
		sutudent = new ArrayList<>();
		student_name = "西川";
		sutudent.add(my.scoring(student_name));
		student_name = "南田";
		sutudent.add(my.scoring(student_name));
		student_name = "北山";
		sutudent.add(my.scoring(student_name));
		student_name = "東屋";
		sutudent.add(my.scoring(student_name));
		int i=0;
		while(sutudent.size() > i) {
			System.out.println("出席番号 : " + (i+1));
			for (String key : sutudent.get(i).keySet()) { 
				Integer values = sutudent.get(i).get(key); 
				System.out.println("Key : " + key + " value: " + values);
			}
			i++;
		}
	}
	
	public Map<String,Integer> scoring(String name){
		Map<String,Integer> subject;
		subject  = new HashMap<>();
		if(name.equalsIgnoreCase("西川")) {
			subject.put("数学", 100);
			subject.put("英語", 82);
			subject.put("国都", 56);
		} else if (name.equalsIgnoreCase("南田")) {
			subject.put("数学", 70);
			subject.put("英語", 92);
			subject.put("国都", 86);
		} else if (name.equalsIgnoreCase("北山")) {
			subject.put("英語", 92);
			subject.put("国都", 86);
			subject.put("理科", 98);
		} else if (name.equalsIgnoreCase("東屋")) {
			subject.put("英語", 92);
			subject.put("国都", 86);
		}
		return subject;
	}
}
スポンサーリンク