我应该创建一个方法,将两个给定的预先排序的字符串列表合并为一个。所有这一切都必须在一个循环中完成。我的方法是比较每个索引处的两个ArrayLists,并根据这些比较按字母顺序添加它们。这个问题是,如果给你两个ArrayLists [“Bob”,“Jill”]和[“Watson”,“Zane”],输出将是[“Bob”,“Watson”,“Jill”,“赞恩“。这显然没有分类。
话虽如此,我知道问题是什么,我只是不知道如何实现它的修复。
代码:
public static ArrayList<String> merge(ArrayList<String> al1, ArrayList<String> al2){
ArrayList<String> al = new ArrayList<String> (al1.size() + al2.size());
for (int i = 0; i < Math.max(al1.size(), al2.size()); i++) { // Loops until max size of the two arraylists is reached
if (i < al1.size() && i < al2.size()) { // Checks if the index is still in range of both arraylists
if (al1.get(i).compareTo(al2.get(i)) < 0) { // Compares the two arraylists at the same index
al.add(al1.get(i));
al.add(al2.get(i));
} else {
al.add(al2.get(i));
al.add(al1.get(i));
}
} else if (i < al1.size() && i > al2.size()) { // Checks if the index is greater than the size of al2
al.add(al1.get(i));
} else { // Anything else, just add al2
al.add(al2.get(i));
}
}
return al;
答案 0 :(得分:0)
您正在使用一个索引i
来索引a1
和a2
,这意味着您无法独立浏览这两个列表。正如您所注意到的那样,应该通过从第一个列表中获取所有三个元素来合并一对列表[1, 2, 3]
和[4, 5, 6]
,然后然后从第二个列表中获取元素。通过同时遍历两个列表,这是不可能的。
而是跟踪两个单独的标记,例如i1
和i2
,并单独递增它们。在每次迭代时,确定哪个索引较小,添加该值并增加该索引。一旦你到达一个列表或另一个列表的末尾,你只需要排空剩余的列表。
答案 1 :(得分:0)
你应该看看合并排序算法的合并步骤: https://en.wikipedia.org/wiki/Merge_sort
总而言之,你应该有类似的东西:
int i = 0;
int j = 0;
while (i < a.size() && j < b.size()) {
if (a.get(i).compareTo(b.get(j)) <= 0) {
result.add(a.get(i));
++i;
} else {
result.add(b.get(j));
++j;
}
}
for (; i < a.size(); ++i) {
result.add(a.get(i));
}
for (; j < a.size(); ++j) {
result.add(b.get(j));
}
return result;
不要测试它,但结果你应该有一些看起来相同的东西
答案 2 :(得分:0)
public static ArrayList<Double> merge(ArrayList<Double> a, ArrayList<Double> b) {
ArrayList<Double> toReturn = new ArrayList<Double>();
int a_ = 0;
int b_ = 0;
for(int j = 0; j < a.size() + b.size(); j++) {
if(a_ == a.size())
toReturn.add(b.get(b_++));
else if(b_ == b.size())
toReturn.add(a.get(a_++));
else if(a.get(a_).compareTo(b.get(b_)) < 0)
toReturn.add(a.get(a_++));
else
toReturn.add(b.get(b_++));
}
return toReturn;
}