iterator fix

This commit is contained in:
pazis 2019-12-05 14:05:20 +00:00
parent 24859d45ab
commit 514e6de373
2 changed files with 179 additions and 180 deletions

View File

@ -1,77 +1,73 @@
package com.baeldung.algorithms.prim; package com.baeldung.algorithms.prim;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.math3.util.Pair; import org.apache.commons.math3.util.Pair;
public class Prim { public class Prim {
private List<Vertex> graph; private List<Vertex> graph;
public Prim(List<Vertex> graph) { public Prim(List<Vertex> graph){
this.graph = graph; this.graph = graph;
} }
public void run() { public void run(){
if (graph.size() > 0) { if (graph.size() > 0){
graph.get(0) graph.get(0).setVisited(true);
.setVisited(true); }
} while (isDisconnected()){
while (isDisconnected()) { Edge nextMinimum = new Edge(Integer.MAX_VALUE);
Edge nextMinimum = new Edge(Integer.MAX_VALUE); Vertex nextVertex = graph.get(0);
Vertex nextVertex = graph.get(0); for (Vertex vertex : graph){
for (Vertex vertex : graph) { if (vertex.isVisited()){
if (vertex.isVisited()) { Pair<Vertex, Edge> candidate = vertex.nextMinimum();
Pair<Vertex, Edge> candidate = vertex.nextMinimum(); if (candidate.getValue().getWeight() < nextMinimum.getWeight()){
if (candidate.getValue() nextMinimum = candidate.getValue();
.getWeight() < nextMinimum.getWeight()) { nextVertex = candidate.getKey();
nextMinimum = candidate.getValue(); }
nextVertex = candidate.getKey(); }
} }
} nextMinimum.setIncluded(true);
} nextVertex.setVisited(true);
nextMinimum.setIncluded(true); }
nextVertex.setVisited(true); }
}
} private boolean isDisconnected(){
for (Vertex vertex : graph){
private boolean isDisconnected() { if (!vertex.isVisited()){
for (Vertex vertex : graph) { return true;
if (!vertex.isVisited()) { }
return true; }
} return false;
} }
return false;
} public String originalGraphToString(){
StringBuilder sb = new StringBuilder();
public String originalGraphToString() { for (Vertex vertex : graph){
StringBuilder sb = new StringBuilder(); sb.append(vertex.originalToString());
for (Vertex vertex : graph) { }
sb.append(vertex.originalToString()); return sb.toString();
} }
return sb.toString();
} public void resetPrintHistory(){
for (Vertex vertex : graph){
public void resetPrintHistory() { Iterator<Map.Entry<Vertex,Edge>> it = vertex.getEdges().entrySet().iterator();
for (Vertex vertex : graph) { while (it.hasNext()) {
Iterator it = vertex.getEdges() Map.Entry<Vertex,Edge> pair = it.next();
.entrySet() pair.getValue().setPrinted(false);
.iterator(); }
while (it.hasNext()) { }
Map.Entry pair = (Map.Entry) it.next(); }
((Edge) pair.getValue()).setPrinted(false);
} public String minimumSpanningTreeToString(){
} StringBuilder sb = new StringBuilder();
} for (Vertex vertex : graph){
sb.append(vertex.includedToString());
public String minimumSpanningTreeToString() { }
StringBuilder sb = new StringBuilder(); return sb.toString();
for (Vertex vertex : graph) { }
sb.append(vertex.includedToString());
} }
return sb.toString();
}
}

View File

@ -1,103 +1,106 @@
package com.baeldung.algorithms.prim; package com.baeldung.algorithms.prim;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import org.apache.commons.math3.util.Pair; import org.apache.commons.math3.util.Pair;
public class Vertex { public class Vertex {
private String label = null; private String label = null;
private Map<Vertex, Edge> edges = new HashMap<>(); private Map<Vertex, Edge> edges = new HashMap<>();
private boolean isVisited = false; private boolean isVisited = false;
public Vertex(String label) { public Vertex(String label){
this.label = label; this.label = label;
} }
public String getLabel() { public String getLabel() {
return label; return label;
} }
public void setLabel(String label) { public void setLabel(String label) {
this.label = label; this.label = label;
} }
public Map<Vertex, Edge> getEdges() { public Map<Vertex, Edge> getEdges() {
return edges; return edges;
} }
public void addEdge(Vertex vertex, Edge edge) { public void addEdge(Vertex vertex, Edge edge){
this.edges.put(vertex, edge); if (this.edges.containsKey(vertex)){
} if (edge.getWeight() < this.edges.get(vertex).getWeight()){
this.edges.replace(vertex, edge);
public boolean isVisited() { }
return isVisited; } else {
} this.edges.put(vertex, edge);
}
public void setVisited(boolean visited) { }
isVisited = visited;
} public boolean isVisited() {
return isVisited;
public Pair<Vertex, Edge> nextMinimum() { }
Edge nextMinimum = new Edge(Integer.MAX_VALUE);
Vertex nextVertex = this; public void setVisited(boolean visited) {
Iterator it = edges.entrySet() isVisited = visited;
.iterator(); }
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next(); public Pair<Vertex, Edge> nextMinimum(){
if (!((Vertex) pair.getKey()).isVisited()) { Edge nextMinimum = new Edge(Integer.MAX_VALUE);
if (!((Edge) pair.getValue()).isIncluded()) { Vertex nextVertex = this;
if (((Edge) pair.getValue()).getWeight() < nextMinimum.getWeight()) { Iterator<Map.Entry<Vertex,Edge>> it = edges.entrySet().iterator();
nextMinimum = (Edge) pair.getValue(); while (it.hasNext()) {
nextVertex = (Vertex) pair.getKey(); Map.Entry<Vertex,Edge> pair = it.next();
} if (!pair.getKey().isVisited()){
} if (!pair.getValue().isIncluded()) {
} if (pair.getValue().getWeight() < nextMinimum.getWeight()) {
} nextMinimum = pair.getValue();
return new Pair<>(nextVertex, nextMinimum); nextVertex = pair.getKey();
} }
}
public String originalToString() { }
StringBuilder sb = new StringBuilder(); }
Iterator it = edges.entrySet() return new Pair<>(nextVertex, nextMinimum);
.iterator(); }
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next(); public String originalToString(){
if (!((Edge) pair.getValue()).isPrinted()) { StringBuilder sb = new StringBuilder();
sb.append(getLabel()); Iterator<Map.Entry<Vertex,Edge>> it = edges.entrySet().iterator();
sb.append(" --- "); while (it.hasNext()) {
sb.append(((Edge) pair.getValue()).getWeight()); Map.Entry<Vertex,Edge> pair = it.next();
sb.append(" --- "); if (!pair.getValue().isPrinted()) {
sb.append(((Vertex) pair.getKey()).getLabel()); sb.append(getLabel());
sb.append("\n"); sb.append(" --- ");
((Edge) pair.getValue()).setPrinted(true); sb.append(pair.getValue().getWeight());
} sb.append(" --- ");
} sb.append(pair.getKey().getLabel());
return sb.toString(); sb.append("\n");
} pair.getValue().setPrinted(true);
}
public String includedToString() { }
StringBuilder sb = new StringBuilder(); return sb.toString();
if (isVisited()) { }
Iterator it = edges.entrySet()
.iterator(); public String includedToString(){
while (it.hasNext()) { StringBuilder sb = new StringBuilder();
Map.Entry pair = (Map.Entry) it.next(); if (isVisited()) {
if (((Edge) pair.getValue()).isIncluded()) { Iterator<Map.Entry<Vertex,Edge>> it = edges.entrySet().iterator();
if (!((Edge) pair.getValue()).isPrinted()) { while (it.hasNext()) {
sb.append(getLabel()); Map.Entry<Vertex,Edge> pair = it.next();
sb.append(" --- "); if (pair.getValue().isIncluded()) {
sb.append(((Edge) pair.getValue()).getWeight()); if (!pair.getValue().isPrinted()) {
sb.append(" --- "); sb.append(getLabel());
sb.append(((Vertex) pair.getKey()).getLabel()); sb.append(" --- ");
sb.append("\n"); sb.append(pair.getValue().getWeight());
((Edge) pair.getValue()).setPrinted(true); sb.append(" --- ");
} sb.append(pair.getKey().getLabel());
} sb.append("\n");
} pair.getValue().setPrinted(true);
} }
return sb.toString(); }
} }
} }
return sb.toString();
}
}