【发布时间】:2019-12-07 23:04:33
【问题描述】:
我已经使用嵌套的 HashMap 编写了我的代码,我试图弄清楚如何将内部映射的键指向的所有值放入 ArrayList 中,以便对其进行正确排序。 我的地图是这样的:
HashMap<String, HashMap<String, Double>> vlist;
我的想法是创建另一个与之前显示的内部映射具有相同键和值的 HashMap, 然后以这种方式填充它。
HashMap<String, Double> vlistValues = new HashMap<>(vlist.values());
我得到一个编译错误,我可以弄清楚编译器不知道我的外部映射的值是一个映射本身,但是阅读 hashmap 文档我没有找到适合我的情况的方法。
基本上我想把这里声明的内部映射的所有值HashMap<String ,HashMap<String, Double>> vlist; 放到像这样ArrayList<Double> listOfValues; 这样的列表中
如果不清楚我对编程完全陌生:-)
我将展示一个示例:
我的地图HashMap<String, Hashmap<String,Double>> 表示加权图的邻接列表。我需要对所有边进行排序(因为我正在尝试实现 Kruskal 算法),我的想法是将所有权重放在一个列表中,执行如下操作:
ArrayList<String> vertexList; //all the vertices of the graph
ArrayList<Double> weights;
HashMap<String, String> orderedEdges = new HashMap<>(); //here i put ordered edges
double min = Collections.min(weights); //i use this double to keep track of the minimum element in weights
for(String vertex1 : vertexlist){
makeSet(vertex1);
for(String vertex2 : ajacents(vertex1)){
if(getEdgeWeight(v1,v2) <= min){ //method "getEdgeWeight" is to retrieve weight of an edge
orderedEdges.put(v1,v2);
min = getEdgeWeight(v1,v2)
weights.remove(min) //i'm not sure this line is correct
}
}
}
在线查看一些伪代码,我看到它能够制作不相交的集合并在同一个 for 循环中对边进行排序。可能我的代码效率不高,但我真的不知道如何在不访问所有图形的情况下对边缘进行排序。 Ps 我不能使用优先队列,但我完全知道我正在尝试做的是类似的事情
【问题讨论】:
-
你现在可以考虑接受一个答案 ;) 来奖励那些为你花时间的人 ;)
标签: java arraylist collections hashmap kruskals-algorithm