如何合并列表,保留每个订单?

时间:2018-01-26 12:58:28

标签: java algorithm list sorting

我有几个列表,都有自己的订单。列表通常共享相似/相等的子范围。有些列表多次包含一个项目。

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中找到一个好的,有效的结果列表?

结果列表有效,如果可以通过删除项目将其转换为任何输入列表。

首选简短结果列表。

1 个答案:

答案 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;秩序 - 不知道好的方法;但是假设列表的数量很少,你可以尝试每个排列并选择最短的。