【发布时间】:2020-03-10 12:07:44
【问题描述】:
我从 2 天开始就尝试解决一个问题,但我的算法似乎太复杂了。 我需要生成 1 个合并 2 个有序列表的数据列表(在“列表 A”和“列表 B”下面命名) 此合并必须基于参考有序列表来确定每个元素的放置位置。 如果列表 A 和列表 B 包含相同的排名值,我只需要保留其中一个
例如:
参考列表:1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
列表 A : 2 | 4 | 6
清单 B : 1 | 4预期结果:1 | 2 | 4 | 6
代码
private static List<String> mergeListsUsingRef(final List<String> listRef, final List<String> listA, final List<String> listB) {
final List<String> res = new ArrayList<>();
final Iterator<String> listRefIterator = listRef.iterator();
final Iterator<String> listAIterator = listA.iterator();
final Iterator<String> listBIterator = listB.iterator();
String a = listAIterator.hasNext() ? listAIterator.next() : null;
String b = listBIterator.hasNext() ? listBIterator.next() : null;
while (listRefIterator.hasNext() && (a != null || b != null)) {
final String ref = listRefIterator.next();
if (a != null && ref.equals(a)) {
res.add(a);
if (b != null && ref.equals(b)) {
b = listBIterator.hasNext() ? listBIterator.next() : null;
}
a = listAIterator.hasNext() ? listAIterator.next() : null;
} else if (b != null && ref.equals(b)) {
res.add(b);
b = listBIterator.hasNext() ? listBIterator.next() : null;
}
}
return res;
}
现在我必须复杂化最初的问题。主要困难来自于在每个列表中多次具有相同值的可能性。 这意味着找出允许重复值的位置。
让我们想象一些例子来说明这一点(其中 4 出现在参考列表中两次)
参考列表:1 | 2 | 3 | 4 | 5 | 6 | 4 | 7 | 8
列表 A : 2 | 3 | 5 | 4 | 7
列表 B:4 | 7 | 8预期结果:2 | 3 | 5 | 4 | 7 | 8
说明:
在列表 A 中:关于参考列表,4 介于 5 和 7 之间,因此 4 只能放在第二位
在列表 B 中:关于参考列表,我无法确定 4 在哪里(第一或第二级)
所以,List A 确定了 4 在第二名的位置
参考列表:1 | 2 | 3 | 4 | 5 | 6 | 4 | 7 | 8
列表 A : 2 | 3 | 4 | 5 | 7
列表 B:4 | 7 | 8预期结果:2 | 3 | 4 | 5 | 7 | 8
说明:
在列表 A 中:关于参考列表,4 介于 3 和 5 之间,因此 4 只能放在第一排
在列表 B 中:关于参考列表,我无法确定 4 在哪里(第一或第二级)
所以,List A 确定 4 的排名第一
参考列表:1 | 2 | 3 | 4 | 5 | 6 | 4 | 7 | 8
列表 A : 2 | 3 | 4 | 5 | 7
清单 B : 6 | 4 | 7 | 8预期结果:2 | 3 | 4 | 5 | 6 | 4 | 7 | 8
说明:
在列表 A 中:关于参考列表,4 介于 3 和 5 之间,因此 4 只能放在第一排
在列表 B 中:关于参考列表,4 介于 6 和 7 之间,因此 4 只能放在第二位
所以,4必须放在第一和第二位
参考列表:1 | 2 | 3 | 4 | 5 | 6 | 4 | 7 | 8
列表 A : 2 | 3 | 4 | 5 | 7
清单 B : 6 | 7 | 8预期结果:2 | 3 | 4 | 5 | 6 | 7 | 8
说明:
在列表 A 中:关于参考列表,4 介于 3 和 5 之间,因此 4 只能放在第一排
在列表 B 中:0 次出现 4 所以,List A 确定 4 的排名第一
我以前的代码无法处理这些困难的情况。 有谁知道如何帮助我推进其实施? :)
编辑: 用于验证实现的主要 Java :D
public static void main(String[] args) {
System.out.println("EX 1 : ");
List<String> refList = Arrays.asList("1", "2", "3", "4", "5", "6", "4",
"7", "8");
List<String> listA = Arrays.asList("2", "3", "5", "4", "7");
List<String> listB = Arrays.asList("4", "7", "8");
List<String> mergeListsUsingRef = mergeListsUsingRef(refList, listA,
listB);
System.out.println("Expected : 2 | 3 | 5 | 4 | 7 | 8 ");
System.out.print("Actual : ");
for (String res : mergeListsUsingRef) {
System.out.print(res + " | ");
}
System.out.println("");
System.out.println("----------------------------------");
System.out.println("EX 2 : ");
refList = Arrays.asList("1", "2", "3", "4", "5", "6", "4", "7", "8");
listA = Arrays.asList("2", "3", "4", "5", "7");
listB = Arrays.asList("4", "7", "8");
mergeListsUsingRef = mergeListsUsingRef(refList, listA, listB);
System.out.println("Expected : 2 | 3 | 4 | 5 | 7 | 8 ");
System.out.print("Actual : ");
for (String res : mergeListsUsingRef) {
System.out.print(res + " | ");
}
System.out.println("");
System.out.println("----------------------------------");
System.out.println("EX 3 : ");
refList = Arrays.asList("1", "2", "3", "4", "5", "6", "4", "7", "8");
listA = Arrays.asList("2", "3", "4", "5", "7");
listB = Arrays.asList("6", "4", "7", "8");
mergeListsUsingRef = mergeListsUsingRef(refList, listA, listB);
System.out.println("Expected : 2 | 3 | 4 | 5 | 6 | 4 | 7 | 8 ");
System.out.print("Actual : ");
for (String res : mergeListsUsingRef) {
System.out.print(res + " | ");
}
System.out.println("");
System.out.println("----------------------------------");
System.out.println("EX 4 : ");
refList = Arrays.asList("1", "2", "3", "4", "5", "6", "4", "7", "8");
listA = Arrays.asList("2", "3", "4", "5", "7");
listB = Arrays.asList("6", "7", "8");
mergeListsUsingRef = mergeListsUsingRef(refList, listA, listB);
System.out.println("Expected : 2 | 3 | 4 | 5 | 6 | 7 | 8 ");
System.out.print("Actual : ");
for (String res : mergeListsUsingRef) {
System.out.print(res + " | ");
}
}
【问题讨论】:
-
我不明白在参考列表中多次出现相同值的情况下的规则是什么。
-
看起来像引用列表与列表 A 和列表 B 的交集,如果是这种情况,您可以将 HashSet 与 RetainAll 方法一起使用
-
是的,将两个列表相交(参考列表根本不相关?!)......也许使用集合。是的,我同意:我不清楚您的要求。尝试找到参考列表真正重要的示例。
-
我假设元素的顺序在这里也很重要。
-
为什么前 4 个在 EX 1 中被抑制,而在 EX 3 中没有?我不明白这个逻辑。我无法从你所说的推断出规则。
标签: java algorithm list collections merge