【Java】Mapの比較

  • 1
    いいね
  • 4
    コメント

Mapの比較方法

・やりたいこと
リストAとリストBの比較を行い、どちらにもあるものとリストAにあるものだけ抽出したい
更新のときと新規のときで処理を変えたい

※2016/12/16:asahina_devさんの指摘を受けて修正しました。

qiita.rb
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // MAP-A
        Map<String, String> listA = new HashMap<String, String>();
        listA.put("fruits","apple");
        listA.put("animal","cat");
        listA.put("sports","soccer");
        listA.put("drink","water");
        // MAP-B
        Map<String, String> listB = new HashMap<String, String>();
        listB.put("sports","soccer");
        listB.put("fruits","apple");
        listB.put("color","red");

        //Set<Map.Entry<K,V>>でまわしてリストBにもあれば更新、なければ新規
        for(Map.Entry<String,String> entry : listA.entrySet()){
            String key = entry.getKey();
            String val = entry.getValue();
            if(listB.get(key) != null){
                entry.setValue(val + "Koshin");
            } else {
                entry.setValue(val + "Shinki");
            }
        }   
        System.out.println(listA);
    }
}

実際にはもっと複雑だったけど、簡易化するとこんな感じになった。
最初はリストCを用意しておいて共通した要素をリストCに放り込んで、リストA,Bからはその要素を削除していき、最後にリストAに要素が残っていれば新規としていれるって形にしたんだけど、iteratorで回してる時にその要素に変更を加えるとだめらしく、エラーが発生したので変更した。このほうがすっきりしてていいね。