繁体   English   中英

HashMap返回Null,无论如何

[英]HashMap returns Null no matter what

我在概念化此问题时遇到了一些麻烦,因此,如果该问题含糊其辞或在其他地方已解决,我谨向您致歉。

无论如何,我有一个叫做Board大班。 板中是ArrayList<Space> sList ,板中的ArrayList<Space> sList列表。 每个空间是哪个bList ,一个HashMap,表示哪个空间与该特定空间接壤。 Boardinit()方法创建所有空间并为其指定边界,例如

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时,它总是返回null,就像我从未向bList添加任何东西一样。 但是,如果我查看Space本身,则bList总是充满项目。 因此,基本上,我试图从另一个类的一个类中调用一个变量,并且仅当我位于另一个类本身内时,它才会显示非空值-有什么想法(或澄清问题)?

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

如果Space有一个返回bList(是hashMap)的getBList()getter,并且在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";
    }

}

我建议您阅读Javadoc for Object.hashCode()

返回对象的哈希码值。 支持此方法是为了使哈希表(例如HashMap提供的哈希表)受益。

Object.equals()

除非您覆盖这些对象,否则两个对象都不相同,除非它们是同一对象,无论您在其中设置了什么值。

对于密钥,必须同时实现这两种方法。 对于地图的值,如果不使用它,则可能仅实现equals(Object)或不实现。

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

您需要在类Arrow上实现equals()hashcode()方法。 查看您的代码,我无法确定您如何/在何处将元素添加到地图中。 因此,如果有帮助,我在下面给出一个简单的示例。 正如另一个人提到的那样,您必须通过阅读更多内容来了解​​hashmap的工作原理。

public class Arrow { private String elem1 = "init-value"; private int elem2 = 1001; { 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;
}

}

it.remove()一直从HashMap中删除我的密钥。 现在可以使用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM