2

ここで問題が発生しました。文字列のリストとフロート値をエントリとして保存する必要があります。を使用することを考えていますHashMapが、それはいくつかの問題を引き起こしています。

float 値に対して 3 つの String 値を 1 つのエントリに格納したいと考えています。このようなもの

"X","Y","Z" -> 0.5 
"P","Q","R" -> 0.2
"Y","X","Z" -> 0.6

問題は、3 つのキー値の順序が一意であるため、繰り返してはならないということです。私はこれらのようなことを試みています

HashMap<List<String>, Float> q= new HashMap<List<String>, Float>();

しかし、一意性などを維持するために何もしないと思うので、値を挿入することはできません

q.put(["N","V","D"], 0.5F);
//The above gives error

告白

このアプローチを提案されましたが、実装方法がわかりませんMyKeyClass。これが正しい方法である場合は、これで私を助けてください!!

Map<MyKeyClass, Integer> map = new HashMap<MyKeyClass, Integer>();
map.put(new MyKeyClass("A", "B","C"), 1);
map.put(new MyKeyClass("A", "C","B"), 2);
4

3 に答える 3

4

and を使用して要素の順序を区別できるようにequals()andを実装hashCode()します。MyKeyClassequals()hashCode()

class MyKeyClass extends Object {
   String a;
   String b;
   String c;

   public MyKeyClass(String a, String b, String c) {
       this.a = a;
       this.b = b;
       this.c = c;
   }

   @Override
   public boolean equals(Object obj) {
       if (!(obj instanceof MyKeyClass))
          return false;
       else {
           MyKeyClass mkc = (MyKeyClass) obj;
            return this.a.equals(mkc.a) && this.b.equals(mkc.b)
                  && this.c.equals(mkc.c);

       }
    }
    @Override
    // This needs to be implemented shrewedly.I think my logic is bad.
    public int hashCode(){
       return a.hashCode()-b.hashCode()-c.hashCode();
    }
   }
于 2013-05-02T05:59:42.953 に答える
3

そのため、 asHashMap<List<String>, Float>を提供する必要があります。listkey

List<String> myList = new ArrayList<String>();
myList.add("N");
myList.add("V");
myList.add("D");

q.put(myList, 0.5F);

また、あなたに与えられた提案は非常に優れており、MyKeyクラスでこのようなことを行うことができます.

class MyKey{
    String s1;
    String s1;
    String s1;

    public MyKey(){}
    public MyKey(String s1, String s2, String s3){
    this.s1 = s1;
    this.s2 = s2;
    this.s3 = s3;
    }

    // Getter Setter for s1,s2,s3 - Remove them, to make it immutable (as @ Bhesh Gurung suggested)
    // Implement the equals() & hashCode() methods
}
于 2013-05-02T05:58:03.043 に答える
2

HashMap のキーは、具体的には文字列のリストである必要がありますか? Hashmap のキーとして文字列のリストを使用する代わりに、すべての文字列を 1 つの文字列に結合し、その単一の文字列をキーとして使用してみませんか? おそらく次のようなものです:

HashMap<String, Float> q = new HashMap<String, Float>();
q.put("N:V:D", 0.5F);

//add new key-value pair to HashMap
String a = "A";
String b = "B";
String c = "C";
String abc = a + ":" + b + ":" + c;
q.put(abc, 0.7F);

//retrieve value from HashMap
float value = q.get(abc);

編集:

ただし、他の人が指摘しているように、文字列をクラスに格納し、代わりにそれをキーとして使用する方がおそらく良いでしょう。文字列の数を変更したり、キーに別のデータ型を使用したりする場合は、その変更を行う方がはるかに簡単です。

于 2013-05-02T06:12:13.637 に答える