Одним из решений является создание смежной карты точек к точкам-линиям.
Вы определяете, какие соседние точки данной точки и какие линии:
class PointAdj {
String point;
String line;//Or int
}
Определить карту как:
Map<String, List<PointAdj>> pontAdjMap = new HashMap<>();
Начните читать со стола и заполните карту:
(я полагаю, что вход представляет собой двумерный массив с именем input)
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);
}
});
Теперь строки должны быть конечным результатом.
Обратите внимание, что я не тестировал это решение, и оно может содержать некоторые проблемы с крайним случаем. Но я думаю, что общая идея в порядке.