我在概念化这个问题时遇到了一些麻烦,所以如果它含糊不清或在其他地方得到解决,我会提前道歉。
无论如何,我有一个名为ArrayList<Space> sList
的大班。在船上是bList
,是董事会中的空间列表。其中每个空间为init()
,一个HashMap表示哪个空格与此特定空间相邻。 Board
sList.add(new Location(7, true, "Police Station"));
sList.get(3).addToBList(sList.get(7)); //adds "Police Station" to the bList at sList index 3
方法会创建所有空格并为其提供边框,例如
Board
但是,如果在bList
中,我尝试查看某个Space的public class Board {
ArrayList<Space> sList;
ArrayList<Player> pList;
int moveCount = 0;
ArrayList<Space> visited = new ArrayList<Space>();
public Board(int p, int oldGod){ //num of players, Old God
sList=new ArrayList<Space>();
pList=new ArrayList<Player>();
init();
move(sList.get(0), sList.get(34));
}
public Space move(Space start, Space end){
visited.add(start);
Iterator it = start.bList.entrySet().iterator();//this is where the trouble starts. bList returns only {}
if(start.equals(end)){
System.out.println("Here! You've arrived at " + start);
}
else{System.out.println("Time to debug. You're at " + start);
while(it.hasNext()){
Map.Entry pair = (Map.Entry)it.next();
for(Space s : visited){
if(pair.getValue().equals(s)){
}
else{
return move((Space)pair.getValue(), end);
}
}
}
}
return start;
}
private void init() {
sList.add(new Location(1, true, "Ma's Boarding House"));
sList.add(new Location(2, true, "South Church"));
sList.get(1).addToBList(sList.get(2));
//etc...
}
}
public abstract class Space {
int district;
String name;
HashMap<Arrow, Space> bList = new HashMap<Arrow, Space>();
ArrayList<Creep> cList = new ArrayList<Creep>();
ArrayList<Player> pList = new ArrayList<Player>();
public String toString() {
return name;
}
public void addToBList(Space s, Arrow a){
bList.put(a, s);
}
public void borderList(){ //in here it always sees bList as full of variables
Iterator it = bList.entrySet().iterator();
while(it.hasNext()){
Map.Entry pair = (Map.Entry)it.next();
System.out.println(this + ": " + pair.getKey() + "-> " + pair.getValue()); //arrow towards
it.remove();
}
}
}
public class Arrow {
int color;
public Arrow(int c){
color=c;
}
public String toString(){
if(color==0)
return "Black";
else if(color==1)
return "White";
else if(color==2)
return "Both";
else
return "None";
}
}
,它总是返回null,就像我从未向bList添加任何东西一样。但是,如果我查看Space本身,bList总是充满了项目。所以,基本上,我试图从另一个类中的类调用一个变量,如果我在其他类本身 - 任何想法(或澄清问题)中,它只显示非空值?
如果Space有一个getBList()getter返回bList(这是一个hashMap),并且在Board中我向该bList添加了某些值,为什么当我在Board中调用getBList()时bList返回“{}”? / p>
此外,这就是所有的箭头(见下)。
代码本身:
{{1}}
答案 0 :(得分:1)
我建议您阅读Object.hashCode()
的Javadoc返回对象的哈希码值。支持此方法是为了哈希表的优势,例如HashMap提供的哈希表。
除非你覆盖这些,否则两个对象不一样,除非它们是同一个对象,不管你在它们中设置了什么值。
对于键,您必须实现这两种方法。对于地图的值,如果不使用它,则可能只实现equals(Object)
。
BTW:我建议您阅读java.lang
和java.util
答案 1 :(得分:0)
您需要在班级equals()
上实施方法hashcode()
和Arrow
。查看代码,我无法确定如何/在何处将元素添加到地图中。所以我只是给出一个简单的例子,如果有帮助的话。正如另一个人所提到的,你必须通过阅读更多关于它的方法来理解hashmap的工作原理。
public class Arrow
{
private String elem1 = "init-value";
private int elem2 = 1001;
public Arrow(String elem1, int elem2)
{
this.elem1 = elem1;
this.elem2 = elem2;
}
@Override
public boolean equals(Object obj)
{
if( ! (obj instanceof Arrow) )
{
return false;
}
Arrow obj2 = (Arrow) obj;
// put your actual logic for object equality here
return this.elem1.equals(obj2.elem2) && this.elem2 == obj2.elem2;
}
@Override
public int hashCode()
{
//put some logic to calculate hashcode for this object. This is used by
// hashmap to find index/slot for your key
return 17 * elem1.hashCode() * elem2;
}
}
答案 2 :(得分:0)
it.remove()一直从HashMap中删除我的键。它现在有效!