[英]Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.HashMap.get(Object)" is null
[英]java.util.HashMap.get method returns 2 values for one key
我制作了一個Graph類,該類使用HashMap>將節點保留為鍵,並將相應邊保留為值。
public class GraphAL {
private HashMap<Integer, ArrayList<Integer>> adjList;
private ArrayList<Integer> vertices;
int numberOfNodes;
boolean visited[];
GraphAL(HashMap<Integer, ArrayList<Integer>> adjList,
ArrayList<Integer> vertices, int numberOfNodes){
this.adjList = adjList;
this.vertices = vertices;
this.numberOfNodes = numberOfNodes;
visited = new boolean[this.numberOfNodes];
}
public HashMap<Integer, ArrayList<Integer>> getAdjList() {
return adjList;
}
public ArrayList<Integer> getVertices() {
return vertices;
}
public int getNumeberOfNodes()
{
return numberOfNodes;
}
public boolean[] getVIsitedNodes()
{
return visited;
}
public void setVisitedNodesToTrue(int node)
{
visited[node] = true;
}
}
然后,我制作了一種方法來反轉圖形。 問題是盡管我的鍵是唯一的,但是java.util.HashMap.get方法返回2個值而不是1個。 這導致將邊緣添加到比我要添加邊緣的確切節點更多的邊緣。
public static GraphAL reverseGraph(GraphAL g)
{
HashMap<Integer, ArrayList<Integer>> revAdjList = new HashMap<Integer, ArrayList<Integer>>();
ArrayList<Integer> revVertices = new ArrayList<Integer>();
System.out.println("Printing in for loop");
for(Integer x:g.getVertices())
{
System.out.println("x = " + x);
ArrayList<Integer> edges = new ArrayList<Integer>();
edges.add(x);
System.out.println("Edges: ");
for(Integer m:edges)
{
System.out.print(m + " ");
}
for(Integer y:g.getAdjList().get(x))
{
System.out.println("y = " + y);
if(!revVertices.contains(y))
{
revVertices.add(y);
System.out.println("RevVertices: ");
for(Integer n:revVertices)
{
System.out.print(n + " ");
}
}
if(revAdjList.containsKey(y))
{
for(Integer o:revAdjList.get(5))
{
System.out.println(5 + " contains " + o);
}
System.out.println("adding " + x + " to " + y);
revAdjList.get(y).add(x);
for(Integer o:revAdjList.get(y))
{
System.out.println(y + " contains " + o);
}
for(Integer o:revAdjList.get(5))
{
System.out.println(5 + " contains " + o);
}
}
else
{
revAdjList.put(y, edges);
System.out.println("putting " + x + " at " + y);
}
System.out.println("Current AdjList: ");
for(Integer h:revVertices)
{
System.out.print("vertice is: " + h + " ");
for(Integer j:revAdjList.get(h))
{
System.out.print("edge : " + j + " ");
}
System.out.println();
}
}
}
System.out.println("Done printing in for loop");
GraphAL revGraph = new GraphAL(revAdjList, revVertices, g.getNumeberOfNodes());
return revGraph;
}
對不起所有的print.ln,但我想確定問題出在哪里。 它看起來像revAdjList.get(y).add(x),其中y = 6和x = 3像我想要的那樣也從鍵6和鍵5返回對應的ArrayList。Ofc導致將邊3加到6就像我想要的一樣,但它也將其添加到5。 思考?
x = 3
Edges:
3 y = 6
5 contains 8
adding 3 to 6
6 contains 8
6 contains 3
5 contains 8
5 contains 3
adding 3 to 6
Current AdjList:
vertice is: 1 edge : 7
vertice is: 2 edge : 5
vertice is: 3 edge : 9
vertice is: 7 edge : 9
vertice is: 4 edge : 1
vertice is: 5 edge : 8 edge : 3
vertice is: 6 edge : 8 edge : 3
問題發生在這條線上
for (Integer j : revAdjList.get(h)) {
System.out.print("edge : " + j + " ");
}
讓我們在這里指出問題,以及為什么它兩次打印出"edge"
revAdjList.get(h)
返回一個Integer
的集合而不是一個Integer,因此它可以具有任意多個整數值,因為您將其定義為一個集合而不是一個一噸噸。
您要從此處添加多個邊
for (Integer m : edges) {
System.out.print(m + " ");
}
如果只需要1條邊,請勿將edges
為數組。
HashMap<Integer, ArrayList<Integer>> revAdjList = new HashMap<>();
應該定義為
HashMap<Integer, Integer> revAdjList = new HashMap<>();
完成之后,您可以刪除循環並清理代碼以使用新語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.