Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何合并列表,保留每个列表';什么命令?_Java_Algorithm_List_Sorting - Fatal编程技术网

Java 如何合并列表,保留每个列表';什么命令?

Java 如何合并列表,保留每个列表';什么命令?,java,algorithm,list,sorting,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

我有几个列表,它们都有自己的顺序。这些列表通常共享相似/相等的子范围。某些列表多次包含一个项目

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;
    }
  }
}
List result=new ArrayList();
对于(列表:ListofList){
int startingPos=0;
for(字符串str:list){
int pos=result.subList(startingPos,result.size()).indexOf(str);
如果(位置<0){
//在开始位置或之后找不到。添加到结尾。
结果:添加(str);
startingPos=result.size();
}否则{
//已在列表中;只需更新下一个元素的起始位置。
开始位置+=位置+1;
}
}
}

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

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

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;
    }
  }
}
List result=new ArrayList();
对于(列表:ListofList){
int startingPos=0;
for(字符串str:list){
int pos=result.subList(startingPos,result.size()).indexOf(str);
如果(位置<0){
//在开始位置或之后找不到。添加到结尾。
结果:添加(str);
startingPos=result.size();
}否则{
//已在列表中;只需更新下一个元素的起始位置。
开始位置+=位置+1;
}
}
}


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

您的有效性标准是什么?您所说的“合并”到底是什么意思?原始列表总共有12个元素,但有效结果有8或12个元素。这背后没有容易辨别的逻辑。因为只喜欢短结果,所以忽略它,然后添加所有列表以获得第三个结果?我不会称之为回溯,更像是蛮力,但是,明智的选择是,在合并另一个列表时,看看是否可以重用当前列表中的项目似乎真的很麻烦。但我不确定我的解决方案在任何情况下都能得到最佳结果。你是在寻找OrderedSet吗?你的有效性标准是什么?你所说的“合并”到底是什么意思?原始列表总共有12个元素,但有效结果有8或12个元素。这背后没有容易辨别的逻辑。因为只喜欢短结果,所以忽略它,然后添加所有列表以获得第三个结果?我不会称之为回溯,更像是蛮力,但是,明智的选择是,在合并另一个列表时,看看是否可以重用当前列表中的项目似乎真的很麻烦。但我不确定我的解决方案在任何情况下都能带来最佳效果。您是在订购一套吗?对,
[B,C,D,A,B,E,A,D,F,G]
看起来很棒!()@Aaron除了,它不。。。(太长了)。但感谢ideone——这可能有助于其他答案(或优化此答案)。@slartidan在应用最后一段之前,它不是最优的:)将函数用于原始列表的每个排列;我开始用我可怕的练习匿名类列表来编码,但那太长了,我放弃了。@Aaron我发现了<代码>数组。asList(“A”、“B”、“C”)更简单。@Andy Turner谢谢,我知道有一个更好的解决方案,但没法提醒它,只是匆匆忙忙地做了第一件事。很好,
[B,C,D,A,B,E,A,D,F,G]
看起来很棒!()@Aaron除了,它不。。。(太长了)。但感谢ideone——这可能有助于其他答案(或优化此答案)。@slartidan在应用最后一段之前,它不是最优的:)将函数用于原始列表的每个排列;我开始用我可怕的练习匿名类列表来编码,但那太长了,我放弃了。@Aaron我发现了<代码>数组。asList(“A”、“B”、“C”)更简单。@AndyTurner谢谢,我知道有更好的解决方案,但无法提醒它,只是匆匆忙忙地做了第一件事情