0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Javaのオブジェクト指向 ~Map(連想配列)~

Posted at

目次

1.Java でmapの値(value)を弄る時によくやるコードの書き方
2.注意点

Java でmapの値(value)を弄る時によくやるコードの書き方

Java でmapの値(value)を弄る時によくやるコードの書き方
import java.text.ParseException;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;

// ~中略~

// DBからデータを取得する
List<int> targetIdList = new ArrayList(Arrays.asList(1, 2, 5));

SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
String strStareDate = "2023/09/03 00:00:00";
String strEndDate = "2023/09/04 00:00:00";
Date startDate = sdFormat.parse(strStareDate);
Date endDate = sdFormat.parse(strEndDate);

List<Entity> entityList = nwe dao().findById(targetIdList,startDate, endDate);

// key:ID value:IDに対応するデータ
Map<String, List<entity>> dbDataMap = new LinkedHashMap<>();
for (Entity entity : entityList) {
    List<Entity> mapEntityList = 
        dbDataMap.get(entity.getId());// ★ここ★
    if (Objects.isNull(mapEntityList) { // keyに対応するものがMapに登録されていない場合
        mapEntityList = new ArrayList<>();
        dbDataMap.put(entity.getId(), mapEntityList);
    }
    mapEntityList.add(entity):
}

〇Map

kye value
Id① [[Entity], [Entity]]
Id② [[Entity]]

上記のコードの★ここ★で、Mapから取り出したものがMapに登録されていない(NULLの)場合、

kye value(これ!!)

Mapから取り出したvalueを格納した
mapEntityListがNULLになる。

Mapから取り出したvalueかを変数に格納したモノと、Mapのvalue(Mapのvalue = オブジェクト)は、同じになる。
つまり、Mapから取り出したvaluを格納してあるListに対してaddや+(加算)、-(減算)とかの処理を加えると、Mapの中のValueの値も連動して変わる!!

そのため、わざわざMapから取り出したvalude(オブジェクト)をMapに入れ直したりする必要は無く、この数行で処理が終わる。
(私はいつもこれをやろうとしていつもハマってる。。。)

注意点

事象

Mapから取り出したvalu(オブジェクト)に対して変更を加えているハズなのに変更されていない!!

例)Map(key:Id, value:カウントした結果)
// DBからデータを取得する
List<int> targetIdList = new ArrayList(Arrays.asList(1, 2, 5));

SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
String strStareDate = "2023/09/03 00:00:00";
String strEndDate = "2023/09/04 00:00:00";
Date startDate = sdFormat.parse(strStareDate);
Date endDate = sdFormat.parse(strEndDate);

List<Entity> entityList = nwe dao().findById(targetIdList,startDate, endDate);

// key:ID value:IDに対応するデータ
Map<String, Integer> countMap = new LinkedHashMap<>();

for (Entity entity : entityList) {

    Integer	count = 
        countMap.get(entity.getId());

    if (Objects.isNull(count) { // keyに対応するものがMapに登録されていない場合
	    count = 0;
        countMap.put(entity.getId(), count);
    }
    count = Integer.sum(count, 1): // ★countに1を加算★
}


count = Integer.sum(count, 1): // ★countに1を加算★

countに1を足した値を代入しているハズなのに、加算がされていない!!

理由:

Integer.sum()は関数(メソッド)であるため、戻り値で返されるモノは、countに格納したオブジェクトとは別なオブジェクトである。
Integer.sum()の仕様↓

そのため、countに格納したオブジェクトには変更がされず、値が変わらなかった。

対策

count = Integer.sum(count, 1): // ★countに1を加算★

count += 1: // ★countに1を加算★

にする!!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?