Java 类的Hashmap

Java 类的Hashmap,java,Java,我试着用谷歌搜索Hashmaps的例子,但它们只显示了个位数,没有一个是真正清楚地使用类的。你应该在PlayerNames类中重写对象类的hashcode和equals方法 因为您只想基于OrigName实例变量,所以在计算hashcode时只在hashcode方法中使用它,在比较时只在equals方法中使用它 编辑: 更新了你的课程 班级戏班{ If(PlayerTempNeutral.OrigName == "Bob"){ String CarPart = PlayerTempNeutra

我试着用谷歌搜索Hashmaps的例子,但它们只显示了个位数,没有一个是真正清楚地使用类的。

你应该在PlayerNames类中重写对象类的hashcode和equals方法

因为您只想基于OrigName实例变量,所以在计算hashcode时只在hashcode方法中使用它,在比较时只在equals方法中使用它

编辑: 更新了你的课程

班级戏班{

If(PlayerTempNeutral.OrigName == "Bob"){
 String CarPart = PlayerTempNeutral.TagName; //This would show BobsWindshield ONLY
}
字符串源名称;
字符串标记名;
//字符串DispName;
PlayerNames(字符串起始名、字符串标记名){
this.OrigName=OrigName;
this.TagName=标记名;
//this.DispName=DispName;
}
@凌驾
公共布尔等于(对象o){
if(播放名称的o实例){
PlayerNames p=(PlayerNames)o;
return(p.OrigName==this.OrigName);
}
其他的
返回false;
}
@凌驾
公共int hashCode(){
int hashcode=0;
int MOD=10007;
int-shift=29;

对于(inti=0;i这里需要纠正的几件事,我将尝试解决我看到的那些

首先,Java标准是对变量使用小写名称。这使得读取其他变量非常困难,因为所有内容看起来都像一个类型名

其次,永远不要使用
new String()
来创建新字符串对象。Java字符串是不可变的,JVM维护应用程序中使用的字符串池。使用
new String()创建的字符串
将从传递给该构造函数的字符串创建一个全新的副本,该副本不是从该池中提取的,而是单独分配的(因此实际上,不必要地为池中可能已经存在的字符串对象分配更多内存)。只需传递字符串,如
“bob”
“bobshigheld”

最后,为了直接回答这个问题,因为您的确切用例是不确定的,所以您的解决方案甚至可能不需要散列。如果您只关心相同类型的多个对象的简单存储,那么您可以使用一个

但是,为了使用,您需要记住哈希/映射是键值对的集合。如果您打算存储和索引多个
PlayerNames
对象,则当前的实现基本上是非感官的。请改为:

import java.util.HashMap;
public class MainThread {
    public static void main(String[] args) {
        PlayerNames Bob = new PlayerNames(new String("Bob"),new String("BobsWindshield"));
        HashMap<PlayerNames, Integer> PlayerTempNeutral = new HashMap<PlayerNames, Integer>();
        PlayerTempNeutral.put(Bob,100);
        Integer p =  PlayerTempNeutral.get(Bob);
        System.out.println(p);

    }
}
当然,一旦有了
bob
对象,就可以根据需要使用它(例如:
bob.TagName

我怀疑这可能不一定是您的用例,所以如果您需要更多信息,您必须详细说明


希望这能有所帮助。

你不能用部分键从地图中获取。部分键?我不太了解,我对java非常陌生,所以你必须详细说明:(请通读一遍,它有一个带equals和hashcode的示例类meethod@GinzoMilani,在另一个答案中,Teeg给出了很好的解释,但由于您是java新手,我将使用您更新的类更新我的答案。好吧,那么我如何引用Bobshigheld/Ronsdoor?@GinzoMilani刚刚做了一个更新。忘记添加如何从哈希中获取内容。
    String OrigName;
    String TagName;
    //String DispName;

    PlayerNames(String OrigName,String TagName) {
        this.OrigName = OrigName;
        this.TagName = TagName;
        //this.DispName = DispName;
    }
    @Override
    public boolean equals(Object o){
        if(o instanceof PlayerNames){
            PlayerNames p = (PlayerNames)o;
            return ( p.OrigName == this.OrigName);
        }
        else
            return false;

    }
    @Override
    public int hashCode(){
        int hashcode=0;
        int MOD=10007;
        int shift=29;
        for(int i=0;i<OrigName.length();i++){
            hashcode=((shift*hashcode)%MOD+OrigName.charAt(i))%MOD;
        }
        return hashcode; 
    }
    @Override
    public String toString(){
        return OrigName;
    }
}
import java.util.HashMap;
public class MainThread {
    public static void main(String[] args) {
        PlayerNames Bob = new PlayerNames(new String("Bob"),new String("BobsWindshield"));
        HashMap<PlayerNames, Integer> PlayerTempNeutral = new HashMap<PlayerNames, Integer>();
        PlayerTempNeutral.put(Bob,100);
        Integer p =  PlayerTempNeutral.get(Bob);
        System.out.println(p);

    }
}
HashMap<String, PlayerNames> playerTempNeutral = new HashMap<String, PlayerNames>();
playerTempNeutral.put("Bob", new PlayerNames("Bob", "BobsWindshield");
playerTempNeutral.put("Ron", new PlayerNames("Ron", "RonsDoor");
PlayerNames bob = playerTempNeutral.get("bob");