我有几个列表,都有自己的订单。列表通常共享相似/相等的子范围。有些列表多次包含一个项目。
B,C,D // a list
A,B,E // another list
A,B,A,D // a list, which contains A twice
F,G // a list, which does not overlap with any other range
要显示这些项目,我必须将它们合并在一起。但是,必须严格保留每个清单中的订单。短期结果是首选:
A,B,A,C,D,E,F,G // a valid, good result
A,B,E,A,C,D,F,G // another valid, good result
A,B,E,F,G,C,A,D // yet another valid result
B,C,D,A,B,E,A,B,A,D,F,G // a valid, but long (=bad) result
A,B,C,D,E,F,G // not a valid answer, because the third input list had a B before an A
如何在Java中找到一个好的,有效的结果列表?
结果列表有效,如果可以通过删除项目将其转换为任何输入列表。
首选简短结果列表。
答案 0 :(得分:2)
这个逻辑将合并元素,可能会缩短结果:
List<String> result = new ArrayList<>();
for (List<String> list : listOfLists) {
int startingPos = 0;
for (String str : list) {
int pos = result.subList(startingPos, result.size()).indexOf(str);
if (pos < 0) {
// Not found at or after startingPos. Add to the end.
result.add(str);
startingPos = result.size();
} else {
// Already in the list; just update the starting pos for next element.
startingPos += pos + 1;
}
}
}
至于如何将它们添加到&#34; best&#34;秩序 - 不知道好的方法;但是假设列表的数量很少,你可以尝试每个排列并选择最短的。