我试图在下面实现一个贪心算法,所以我试图按照算法细节的要点,但我在我的IF语句中得到一个错误:java.lang。 IndexOutOfBoundsException:Index:4,Size:4 有谁知道以下方法是否应该如何接近这个?
- 使用第一种颜色为第一个顶点着色。
- 醇>
对剩余的V-1顶点执行以下操作。
a)考虑当前拾取的顶点并用它对其进行着色 以前没有使用过的最低编号颜色 与其相邻的彩色顶点。如果所有以前使用的颜色 出现在与v相邻的顶点上,为其指定一种新颜色。 * /
public void greedy(LinkedHashMap<String, Node> nodes) {
ArrayList<Integer> colors = new ArrayList<Integer>();
ArrayList<Integer> colorsUsed = new ArrayList<Integer>();
nodes.entrySet().iterator().next().getValue().currentColor = 1;
colorsUsed.add(1);
for (Map.Entry<String,Node> entry : nodes.entrySet()) {
for (int i = 0; i < nodes.entrySet().size(); i++) {
if(entry.getValue().edges.get(i).currentColor == 0) {
//assign a color
System.out.println(colors.get(i));
}
}
}
}
答案 0 :(得分:2)
您的嵌套循环没有多大意义并且它是异常的原因(您在节点数处停止i
而不是每个节点的边数,因此索引i
超出了集合entry.getValue().edges
)的范围。
您应该替换
for (int i = 0; i < nodes.entrySet().size(); i++) {
^^^^^^^^^^^^^^^^^^^^^^^
if(entry.getValue().edges.get(i).currentColor == 0) {
类似
for (int i = 0; i < entry.getValue().edges.size(); i++) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if(entry.getValue().edges.get(i).currentColor == 0) {
(假设Node#edged
实现java.util.List)
此外,colors.get(i)
也没有多大意义......
答案 1 :(得分:0)
IndexOutOfBoundsException
告诉您,您的计划正在尝试访问您无法访问的ArrayList
位置,因为其大小小于索引。如果您想了解有关此例外的更多信息,请查看here。
你应该检查你的代码,特别是你的循环。