【问题标题】:HashMap returns Null no matter whatHashMap 无论如何都返回 Null
【发布时间】:2015-06-05 18:41:35
【问题描述】:

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

不管怎样,我有一个名为Board 的大班。板上是ArrayList<Space> sList,板上的空间列表。其中每个 Space 是bList,一个 HashMap,表示哪些 Spaces 与这个特定 Space 接壤。 Boardinit() 方法会创建所有的 Spaces 并给它们提供边界,例如

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 中,我尝试查看某个 Space 的 bList,它总是返回 null,就像我从未向 bList 添加任何内容一样。但是,如果我查看 Space 本身,bList 总是充满了项目。所以,基本上,我试图从另一个类中的一个类中调用一个变量,如果我在另一个类本身中,它只会显示非空值 - 任何想法(或澄清问题)?

编辑:我想我要澄清我自己的问题。

如果 Space 有一个 getBList() getter 返回 bList(这是一个 hashMap),并且在 Board 中我向该 bList 添加某些值,为什么当我在 Board 中调用 getBList() 时 bList 返回“{}”?

此外,这就是 Arrow 的全部内容(见底部)。

代码本身:

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";
    }

}

【问题讨论】:

  • 看起来你忘了实现 equalshashCode,但坦率地说我不知道​​在哪里。
  • 它一定是在Arrow,因为这是唯一被用作键的东西。
  • Arrow 类的代码,请。
  • addToBList(...) 方法需要两个参数,但您在此语句中只传递一个参数 sList.get(1).addToBList(sList.get(2));
  • addToBList 接收 2 个参数,在您的示例中,您只显示一个。对吗?

标签: java hashmap


【解决方案1】:

我建议你阅读 Object.hashCode() 的 Javadoc

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

Object.equals()

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

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

顺便说一句:我建议您阅读 java.langjava.util 中所有类的 Javadoc

【讨论】:

    【解决方案2】:

    您需要在您的类Arrow 上实现方法equals()hashcode()。查看您的代码,我无法确定您将元素添加到地图的方式/位置。因此,如果有帮助,我将在下面给出一个简单的示例。正如另一个人提到的,您必须通过阅读更多内容来了解​​ 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;
    }
    

    }

    【讨论】:

      【解决方案3】:

      it.remove() 不断从 HashMap 中删除我的键。现在可以了!

      【讨论】:

        猜你喜欢
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多