質問: new HashMap<>(); public static void main(String[] args) { check("1", "ばなな"); check("2", "りんご"); check("2", "みかん"); check("2", "りんご");//値の組み合わせが重複する check("3", "ばなな"); check("3", "りんご"); check("1", "りんご"); } static void check(String No, String fruit) { if (check.containsKey(No) && check.containsValue(fruit)) { System.out.println("引数の組み合わせが重複しています"); return; } check.put(No, fruit); System.out.println("No" + No + "," + fruit); } } ``` ### 理想の結果 ``` No1,ばなな No2,りんご No2,みかん 引数の組み合わせが重複しています No3,ばなな No3,りんご No1,りんご ``` ### 実際の結果 ``` No1,ばなな No2,りんご No2,みかん No2,りんご No3,ばなな 引数の組み合わせが重複しています 引数の組み合わせが重複しています ``` ### 問題点 ・現状引数の組み合わせが重複した場合にif文がtrueになるという条件を満たしていない ・HashMapの特性上keyの重複ができないため、「No2,ばなな」「No2,りんご」の二つをチェック することができない。 ### 教えてほしいこと ・理想の結果と同じ結果を出力する。 ・HashMap以外の方法で解決できるのか。
回答: `HashMap`で複数キーを利用したい場合、複数キーを格納したクラスを作成することが多いかと思います。このとき`hashCode()`と`equals()`メソッドを正しくオーバライドすることが重要です。 なお以下のように、valueをMapのBooleanにするような実装は無駄が多いので、このような場合にはHashSetを利用したほうがよいと思います。 ``` import java.util.HashMap; import java.util.Map; import java.util.Objects; public class One { public static void main(String[] args) { check("1", "ばなな"); check("2", "りんご"); check("2", "みかん"); check("2", "りんご");//値の組み合わせが重複する check("3", "ばなな"); check("3", "りんご"); check("1", "りんご"); } private static Map checks = new HashMap<>(); public static void check(String No, String fruit) { Key key = new Key(No, fruit); if (checks.containsKey(key)) { System.out.println("引数の組み合わせが重複しています"); return; } checks.put(key, true); System.out.println("No" + No + "," + fruit); } private static class Key { private String no; private String fruit; public Key(String no, String fruit) { this.no = no; this.fruit = fruit; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof Key)) return false; Key other = (Key)obj; return Objects.equals(this.no, other.no) && Objects.equals(this.fruit, other.fruit); } @Override public int hashCode() { return Objects.hash(this.no, this.fruit); } } } ```