无论如何,HashMap都返回Null

时间:2015-06-05 18:41:36

标签: java hashmap

我在概念化这个问题时遇到了一些麻烦,所以如果它含糊不清或在其他地方得到解决,我会提前道歉。

无论如何,我有一个名为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}}

3 个答案:

答案 0 :(得分:1)

我建议您阅读Object.hashCode()

的Javadoc
  

返回对象的哈希码值。支持此方法是为了哈希表的优势,例如HashMap提供的哈希表。

Object.equals()

除非你覆盖这些,否则两个对象不一样,除非它们是同一个对象,不管你在它们中设置了什么值。

对于键,您必须实现这两种方法。对于地图的值,如果不使用它,则可能只实现equals(Object)

BTW:我建议您阅读java.langjava.util

中所有课程的Javadoc

答案 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中删除我的键。它现在有效!