import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class TrackRemover<T> {
private Map<T, List<T>> edgesBetweenTwoPoints = new HashMap<>();
public void addEdge(T firstCoordinate, T secondCoordinate) {
edgesBetweenTwoPoints.computeIfAbsent(firstCoordinate, x -> new ArrayList<T>()).add(secondCoordinate);
edgesBetweenTwoPoints.computeIfAbsent(secondCoordinate, x -> new ArrayList<T>()).add(firstCoordinate);
}
public Edge<T> getEdge(T start, T dest) {
List<T> list = edgesBetweenTwoPoints.get(start);
if (list != null && list.contains(dest)) {
return new Edge<>(start, dest);
}
return null;
}
public boolean isConnectedAfterRemoving(Set<Edge<T>> toRemove) {
Set<T> notVisited = new HashSet<T>(edgesBetweenTwoPoints.entrySet().stream()
.filter(e -> e.getValue().stream()
.filter(d -> !toRemove.contains(new Edge<>(e, d)) && !toRemove.contains(new Edge<>(d, e)))
.count() > 0)
.map(Map.Entry::getKey).collect(java.util.stream.Collectors.toSet()));
if (notVisited.isEmpty())
return true;
visit(notVisited.iterator().next(), notVisited, toRemove);
return notVisited.isEmpty();
}
private void visit(T next, Set<T> notVisited, Set<Edge<T>> toRemove) {
if (!notVisited.remove(next))
return;
for (T t : edgesBetweenTwoPoints.get(next))
if (!toRemove.contains(new Edge<>(next, t)) && !toRemove.contains(new Edge<>(t, next)))
visit(t, notVisited, toRemove);
}
public Map<T, List<T>> getEdgesBetweenTwoPoints(){
return this.edgesBetweenTwoPoints;
}
public static void main(String[] args) {
TrackRemover<CartesianPoint> g = new TrackRemover<>();
Set<Edge<CartesianPoint>> setToBeRemovedEdges = new HashSet<>();
CartesianPoint p1 = new CartesianPoint(1, 1);
CartesianPoint p2 = new CartesianPoint(5, 1);
CartesianPoint p3 = new CartesianPoint(8, 1);
CartesianPoint p4 = new CartesianPoint(10, 1);
Edge edge1 = new Edge(p1, p2);
Edge edge2 = new Edge(p2, p3);
Edge edge3 = new Edge(p3, p4);
g.addEdge(p1, p2);
g.addEdge(p2, p3);
g.addEdge(p3, p4);
Terminal.printLine(g.getEdgesBetweenTwoPoints());
//
Terminal.printLine(g.getEdgesBetweenTwoPoints().size());
setToBeRemovedEdges.add(g.getEdge(p3, p4));
System.out.println(g.isConnectedAfterRemoving(setToBeRemovedEdges));
}
}