要处理的数据预览:
A
B
C
D
E
A,B
B,C
D,E
第一部分是节点(软件中的点),第二部分(空行之后)是节点之间的连接。
此文件被加载到两个ArrayList中,这两个ArrayList是分开的(节点和连接)。我需要做的就是合并(如果节点中的节点与其他连接中的节点相同)
public class ConsoleProcessor implements IntConsoleProcessor {
List<String> nodeA = new ArrayList<>();
List<String> nodeB = new ArrayList<>();
//From ArrayList split original data to two arrays (point A & B)
private void splitConnections(ArrayList<String> connections){
for(String str:connections)
{
String[] nodes = str.split(",");
nodeA.add(nodes[0]);
nodeB.add(nodes[1]);
}
//Console print for fast check of results
System.out.println(nodeA);
System.out.println(nodeB);
}
public void getResults(ArrayList<String> nodes, ArrayList<String> connections){
splitConnections(connections);
//need to continue somehow
}
}
因此,我想打印到控制台连接A,B,C(或类似名称)和E,D(或D,E)。
想要的结果:
Connection counter: 2
E,D
C,A,B
实际结果只是从连接中打印出nodeA和nodeB
[A, B, E]
[B, C, D]
答案 0 :(得分:0)
您所指的结构称为graph,具有顶点(称为节点)和边缘(称为连接)。
您正在(应该)尝试计算的是查找图的所有connected components。有多种算法可以实现这一点,但是一种简单的方法是通过搜索连接到特定顶点的所有顶点并相应地创建一个组件,例如:
for each vertex A in graph
if A is already visited skip to next
mark A as visited
for each edge A,B in graph
if B is in a connected component
add A to the connected component
else
create new connected component with A and B
您还应该注意管理单个顶点组件,但这只是为了向您提供解决方案的总体思路。