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谢谢,我知道有更好的解决方案,但无法提醒它,只是匆匆忙忙地做了第一件事情