2

我在这里遇到了一些问题。我需要将字符串列表与浮点值存储为条目。我正在考虑使用 a HashMap,但这会产生一些问题。

我想将三个字符串值与一个浮点值存储在一个条目中。像这样的东西

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

问题是三个键值的顺序是唯一的,不应重复。我正在尝试这样的事情

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

实现equals()andhashCode()在你的MyKeyClass这样元素的顺序可以使用equals()和来区分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

由于它HashMap<List<String>, Float>,您需要提供一个listas key

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 的键,不如将所有字符串组合成一个字符串,并使用该单个字符串作为键?也许是这样的:

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 回答