使用 hashmap 表示加权图

representing a weighted graph using hashmap

我的输入文本文件:

  122334 
  45   
  67

输出应该是:

0-{1=2,2=3,3=4} //node 0 is connected to 1 with weight 2,to 2 with weight 3,etc

1-{4=5}

2-{6=7}

下面是我的程序:

public class BFS {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        HashMap<Integer, HashMap<Integer, Integer>>hash1=new HashMap<Integer,     HashMap<Integer,Integer>>();
        HashMap<Integer, Integer>hash2=new HashMap<Integer, Integer>();
        HashMap<Integer, Integer>temp1=new HashMap<Integer, Integer>();
    BufferedReader in = new BufferedReader(new FileReader("C:\Users\Translab\workspace\Algorithms\inputfile.txt"));
        int remainder,remainder2,j=0;
        int line=1;
        String str;
        while ((str =in.readLine()) != null) {
            int foo = Integer.parseInt(str);
          while(foo>0){
                 remainder=foo % 10;
                   foo = foo / 10;
                 remainder2=foo%10;
                 foo=foo/10;
                 temp1.put(remainder2, remainder);
                 hash2.putAll(temp1);

        }
        temp1.clear();
        hash1.put(j, hash2);

        j++;


        }
        for (Entry<Integer, HashMap<Integer, Integer>> entry  : hash1.entrySet()) {
            System.out.println(entry.getKey()+"-"+entry.getValue() );

        }
        in.close();
    }
}

有了这个我得到:

0-{1=2, 2=3, 3=4, 4=5, 6=7}

1-{1=2, 2=3, 3=4, 4=5, 6=7}

2-{1=2, 2=3, 3=4, 4=5, 6=7}

有人可以帮助我吗?我是 hashmap 的新手。

这里我假设你的解析逻辑是正确的,这就是你想要的。 您需要在第一个 while 循环中初始化 hash2 而您实际上根本不需要 temp1

int j=0;    
while ((str =in.readLine()) != null) {
            int foo = Integer.parseInt(str);
          HashMap<Integer, Integer> hash2=new HashMap<Integer, Integer>();
          while(foo>0){
                 remainder=foo % 10;
                   foo = foo / 10;
                 remainder2=foo%10;
                 foo=foo/10;
                 hash2.put(remainder2, remainder);
          }
          hash1.put(j, hash2);
          j++;
    }

您不必要地重载了 Map 和 Integer classes。更好的方法是将图形节点和边封装在 classes 中 - 一旦您开始必须对图形执行操作,这将使事情变得容易得多:

class Node {
    private int id;
    private List<Edge> edges;
    public boolean hasId(int id) {
        return id == this.id;
    }
    public addEdge(Node node, int weight) {
        edges.add(new Edge(node, weight));
    }
}

class Edge {
    private int weight;
    private Node destination;
}

class Graph {
    private List<Node> nodes;
    public Node getNodeById(int id) {
        return nodes.stream()
            .filter(node -> node.hasId(id))
            .findFirst().orElse(null);
    }
}

我还建议您在转换为 id 和权重之前将输入行分解为标记。这可以在 Graph class:

内部完成
public void addEdge(int fromNodeID, String edgeData) {
    Node node = getNodeByID(fromNodeID);
    for (int pos = 0; pos < edgeData.length(); pos += 2) {
        int destNodeID = Integer.parseInt(edgeData.substring(pos, pos+1));
        int weight = Integer.parseInt(edgeData.substring(pos + 1, pos + 2);
        node.addEdge(getNodeByID(destNodeID), weight);
    }
}

那么处理输入就相当简单了:

int id = 0;
Map<Integer, String> edgeData = new HashMap<>();
while((line = in.readLine()) != null) {
    graph.addNode(new Node(id));
    put(id, line);
}
edgeData.entrySet().stream()
    .forEach(entry -> graph.addEdge(entry.getKey(), entry.getValue());

我省略了很多错误检查、简单的构造函数等,但希望你能理解。