2013-10-16 50 views
2

这是我第一次发布问题。重写hashcode()和equals()的HashMap在我的情况下不起作用

请帮我解决我的问题。 在这段代码中,我使用HasMap来存储键值对,这里的键是带有三个由“”空格分隔符分隔的SubStrings的String。

例如,

String t1 = new String("A B C"); 
and stored in HashMap as- 

m.put(t1,27); 

在此,A,B和C是三种不同的字符串。 A,B,C的不同组合假定为唯一的。

Like "A B C", "B A C", "C B A" are all treated as equal. 

我实现这个hashCode()和等于(), 下面的代码应该只打印

A B C:61046662 

但它甚至没有调用hashCode()方法还是equals()。请给我一些建议。

public class Test { 
public int hashCode(){ 
    System.out.println("hashcode method called"); 
    return this.toString().length();  
} 

public boolean equals(Object obj) { 
    System.out.println("equal method called "); 
    int count = 0; 
    if(!(obj instanceof String)) 
     return false; 
    if (obj == this) 
     return true; 
    count = 0; 
    StringTokenizer st = new StringTokenizer(((String)obj).toString(), " "); 
    while(st.hasMoreTokens()){ 
     if(this.toString().contains(st.nextToken())){ 
      count ++; 
     } 
    } 
    return (count == 3); 
} 

public static void main(String[] args) { 

    HashMap<String, Integer> m = new HashMap<String, Integer>(); 

    String t1 = new String("A B C"); 
    String t2 = new String("B A C"); 
    String t3 = new String("C B A"); 

    m.put(t1, 27); 
    m.put(t2, 34); 
    m.put(t3, 45); 

    System.out.println(m.get("A B C")); 

    for(Entry e : m.entrySet()){ 
     System.out.println(((String)e.getKey())+":" +e.getKey().hashCode()); 
    } 
} 
} 
+0

两者彼此不相关。您完全没有使用Test class – Raghav

回答

3

equals()hashCode()方法进不来的图片,因为地图键String型的,而不是Test型。因此正在使用标准字符串比较和散列码。

您需要修改Test,以便它包含该字符串,并相应地更改equals()hashCode()。然后,您需要将地图更改为HashMap<Test,Integer>

+0

感谢您的指导。 好吧,我明白为什么它不工作的概念。 现在实际上我需要的是,我有与上面给出的相同的HashMap。 我需要从条目中删除“A B C”的重复项。我应该用什么方法。 我认为上面会是正确的做法。 –

0

密钥的hashCode用于确定密钥的位置和唯一性。您将String对象添加到地图,因此使用String.hashCode方法。 虽然你已经为你的Test类实现了hashCode,但是并没有使用它们。

要解决您的问题,您可以使用自己的hashCode实现创建自己的用作键的类。 使用你的例子,你可以添加一个属性到你的Test类中,该类可以容纳一个字符串,并在你的地图中使用Test类作为键。

相关问题