需要解决以下问题:
根据以下标准将唯一字符串集拆分为不重叠的组:
如果两行在一列或多列中有匹配的非空值,则它们属于同一组。
例如,线条
111;123;222 200;123;100 300;;100都属于同一个组,因为前两行在第二列中具有相同的值,而后两行在第三列中
123具有相同的值100
程序运行时间(30 秒)也有限制。我还可以添加行数——大约一百万。这是我的代码:
private static Set<TreeSet<Integer>> findLineGroups(List<String> lines) {
Set<TreeSet<Integer>> resultSet = new TreeSet<>((Comparator<TreeSet<Integer>>) (trSet1, trSet2) -> {
int diff = trSet2.size() - trSet1.size();
if (diff != 0)
return diff;
Iterator<Integer> iterator1 = trSet1.iterator();
Iterator<Integer> iterator2 = trSet2.iterator();
while (iterator1.hasNext()) {
diff = iterator1.next() - iterator2.next();
if (diff != 0)
return diff;
}
return 0;
});
Map<String, Integer> termLineGroupsPairs = new HashMap<>();
List<TreeSet<Integer>> lineNumGroups = new ArrayList<>();
for (int lineNum = 0; lineNum < lines.size(); lineNum++) {
String line = lines.get(lineNum);
String[] lineElements = line.replaceAll("\"", "").replaceAll(" ", "").split(";");
Set<String> termSet = new HashSet<>(Arrays.asList(lineElements));
termSet.remove("");
Integer groupNum = null;
TreeSet<String> tempSet = new TreeSet<>(termLineGroupsPairs.keySet());
tempSet.retainAll(termSet); //оставляем только общие элементы
if (!tempSet.isEmpty()) {
String term = tempSet.first();
groupNum = termLineGroupsPairs.get(term);
lineNumGroups.get(groupNum).add(lineNum);
}
if (groupNum == null) {
TreeSet<Integer> group = new TreeSet<>();
group.add(lineNum);
lineNumGroups.add(group);
groupNum = lineNumGroups.size() - 1;
}
for (String term : termSet) {
termLineGroupsPairs.put(term, groupNum);
}
if (lineNumGroups.size() % 1000 == 0)
System.out.println(lineNumGroups.size());
}
resultSet.addAll(lineNumGroups);
return resultSet;
}
而且我所有的解决方案都工作太久(我试图以不同的方式解决这个问题)。诚然,如果少于一千行,那么它可以快速运行(我符合指定的限制),并且几乎可以使用我的任何算法。
请告诉我如何解决这个问题(或在我的解决方案中进行哪些更改以使其快速运行)。

