合并两个String ArrayList并排序的方法返回重复元素,求排查
合并两个字符串ArrayList时元素重复的问题解决
问题根源
你代码里合并两个列表的嵌套for循环逻辑完全错误:
for (int i = 0; i < list1.size(); i++) { for (int j = 0; j < list2.size(); j++) { newList.add(list1.get(i)); newList.add(list2.get(j)); } }
这段嵌套循环会让list1中的每个元素被重复添加list2.size()次,同时list2中的每个元素也被重复添加list1.size()次。比如你的测试用例里两个列表各有3个元素,最终newList里会生成3*2*3=18个元素,和报错结果完全对应。
修正方案
合并两个列表应该用两个独立的for循环,分别遍历两个列表并添加元素,而非嵌套循环:
public static ArrayList<String> mergeStrings(ArrayList<String> list1, ArrayList<String> list2) { ArrayList<String> newList = new ArrayList<String>(); // 先添加list1的所有元素 for (int i = 0; i < list1.size(); i++) { newList.add(list1.get(i)); } // 再添加list2的所有元素 for (int j = 0; j < list2.size(); j++) { newList.add(list2.get(j)); } String temp; // 你的排序逻辑是正确的,无需修改 for (int i = 0; i < newList.size(); i++) { for (int j = i + 1; j < newList.size(); j++) { if (newList.get(i).compareTo(newList.get(j)) > 0) { temp = newList.get(i); newList.set(i, newList.get(j)); newList.set(j, temp); } } } return newList; }
验证结果
修正后运行你的JUnit测试用例,newList会先得到[ant, elephant, camel, deer, bear, frog],再经过排序后生成预期的[ant, bear, camel, deer, elephant, frog],与测试用例的预期结果完全匹配。
内容的提问来源于stack exchange,提问作者Ian Kemp
相关产品推荐
相关产品推荐

