Java:如何检查hashmaps键包含对象?

时间:2014-12-16 04:02:49

标签: java hashmap

基本上,我尝试使用以下代码读取文本文件,以便使用邻接列表表示来构建图形。但是,我遇到了两个问题。

第一个和主要问题是:我不明白当我检查graph.contains(v_l)时,它总是返回false。我现在已经陷入这个问题多年了。真的需要一些帮助。

第二个问题:我不明白为什么在if声明中,我不能做到以下几点:

if(graph.containsKey(v_l) == false){
                // this always fail               
                graph.put(v_l, edges_of_this_vertex.add(v_r));
                // the following works though 
                ArrayList<Vertex> edges_of_this_vertex = new ArrayList<Vertex>();
                edges_of_this_vertex.add(v_r);
                graph.put(v_l, edges_of_this_vertex);
 }

我不知道为什么会这样?

 class Vertex{
            int node;
            ....
            public Vertex(int node){
                 this.node = node;
            }

            public String toString(){
                 return Integer.toString(node);
            }
    }
class dgraph{
 // constructor ...

 // instance method
 public HashMap<Vertex, ArrayList<Vertex>> read_file_and_populate(String file_loc, boolean reverse) throws IOException{

        HashMap<Vertex, ArrayList<Vertex>> graph = new HashMap<Vertex, ArrayList<Vertex>>();
        int l = 0;
        int r = 0;
        if(reverse == false){
            r = 1;
        } else{
            l = 1;
        }

        FileInputStream fil = new FileInputStream(file_loc);
        BufferedReader br = new BufferedReader( new InputStreamReader(fil));
        String element = null;

        while( (element = br.readLine()) != null){
            String[] line = element.split("\\s");
            Vertex v_l = new Vertex( Integer.parseInt(line[l]) );
            Vertex v_r = new Vertex( Integer.parseInt(line[r]) );
            System.out.println("l = " + l + " r = " + r );
            if(graph.containsKey(v_l) == false){
                ArrayList<Vertex> edges_of_this_vertex = new ArrayList<Vertex>();
                edges_of_this_vertex.add(v_r);
                graph.put(v_l, edges_of_this_vertex);
                //graph.put(v_l, edges_of_this_vertex.add(v_r));
            } else{
                graph.get(v_l).add(v_r);

            }
        }
        return graph;
    }
}

以下是一些示例数据:

1 1 
1 2 
1 5 
1 6 
1 7 
1 3 
1 8 
1 4 
2 47646 
2 47647 
2 13019 
2 47648 
2 47649 
2 47650 
2 7700 
2 47651 
2 47652 
3 511596 
5 1 
5 9 

2 个答案:

答案 0 :(得分:1)

您的值类(Vertex)需要实现hashCode&amp; equals(),否则所有操作都将通过检查它是否是相同的实例(在这种情况下它永远不会是)来完成。假设int是Vertex中唯一的状态,hashCode&amp;等于函数应该基于那些。

public int hashCode() {
   return node *31;
}

public boolean equals(Object o) {
    if (o == this) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Vertex r = (Vertex)o;
    return node == r.node;
}

答案 1 :(得分:0)

// this always fail               
            graph.put(v_l, edges_of_this_vertex.add(v_r));

您正尝试将edges_of_this_vertex.add(v_r)的结果添加到图表中。 arraylist的add()函数返回一个布尔值(总是为true)。因此,当您执行graph.get(v_l)时,您将始终获得布尔值true。