java - 如何合并列表,保留每个人的顺序?

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

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

首选简短的结果列表。

最佳答案

此逻辑将合并元素,并可能缩短结果:

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;
    }
  }
}

至于如何以“最佳”顺序添加它们——不知道什么好方法;但假设列表的数量很少,您可以尝试每个排列并选择最短的排列。

关于java - 如何合并列表,保留每个人的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48461851/

相关文章:

java - 在 Apache Spark 上为每个 worker 创建一个单例

android - 如何创建订单?

javascript - JQuery - 分离然后将一个项目附加到列表中 - 为什么这个简单的示例不起作用?

java - 连续读取套接字的所有输入

java - 从 Java 应用程序向 Zebra 打印机发送条码

algorithm - 在 C++ 中使用 opencv 跟踪 AVI 视频中对象的最佳算法

c++ - 如果方法是const,如何找到 vector 的中值?

algorithm - 未知移位的二进制搜索修改

python - 将 utf-8 格式的 Python 列表写入 CSV

java - 尝试了解 @JoinTable 和 @JoinColumn 的工作原理