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