我有直线和点的列表,我需要获取基于点的连接线的列表。
输入为Line及其2点,因此在上例中输入为
以表格格式
,输出应为2个列表 [1,2,3,4,5,6,7]和[8]
我正在创建点到其所属的线列表的地图
A-1
B-1,2,3
C-2 ...
,然后尝试合并找到公共点的线列表。但是无法找到合并这些行的正确方法。 可以有简单的解决方案还是其他解决方案?
答案 0 :(得分:0)
3行和5行不同吗? 如果是,那么很明显每行最多只能有2个点。 如果否,则表格格式不合适。
如果我是你,我会做一张地图,以一条线为键,以点列表为值。 然后创建一个接口,以定义一个点是否一次属于多条线。
答案 1 :(得分:0)
一种解决方案是创建点到点线的相邻贴图。
您定义给定点的相邻点是什么,线是什么:
class PointAdj {
String point;
String line;//Or int
}
将地图定义为:
Map<String, List<PointAdj>> pontAdjMap = new HashMap<>();
从表格开始阅读并填写地图:
(我假设输入是一个称为输入的二维数组)
for (int i =0; i < input.length; i++) {
String[] row = input[i];
List<PointAdj>> adj = pontAdjMap.putIfAbsent(row[1], new ArrayList<>());
if(adj == null) {
adj = pontAdjMap.get(row[1]);
}
adj.add(new PointAdj(row[2], row[0]));
//Also put the reverse side
}
现在pontAdjMap包含所有点及其相邻点。
现在定义一个Set列表,以添加线并循环映射并尽可能多地添加线。
使用队列连续遍历相邻点;
List<Set<String>> lines = new ArrayList<>();
final Set<String> calculated = new HashSet();//Takes care of redundant processing of points;
pontAdjMap.keySet().foreach(pointInMap->{
Set<String> lineSet = new HashSet();
Queue<String> queue = new LinkedList<String>();
queue.offer(pointInMap);
while(!queue.isEmpty()) {
String point = queue.poll();
if(calculated.add(point)) {
for(PointAdj pa: pontAdjMap.get(point)) {
lineSet.add(pa.line);
queue.offer(pa.point);
}
}
}
if(lineSet.size() > 0) {
lines.add(lineSet);
}
});
现在行应该是最终结果。
请注意,我没有测试此解决方案,它可能包含一些极端情况。但我认为总体思路还可以。