我正在研究一个小问题,以使用撤消来反转字符的ArrayList。我已经弄清楚了,但是目前在通过索引检索项目时遇到了一些问题。
我的功能如下:
public static ArrayList<Character> reverseArray(ArrayList<Character> array){
if (array.size() == 1){
return array;
}
// Fetched the last item
ArrayList<Character> lastItem = new ArrayList<Character>();
System.out.println("Index: " + (array.size()-1));
System.out.println("Item at index: "+ (array.size()-1) + "is: " + array.get((array.size()-1)));
lastItem.add(array.get(array.size()-1));
// Remove the last item
array.remove(array.get(array.size()-1));
// Join all arrays until the last entry
lastItem.addAll(reverseArray(array));
return lastItem;
}
通过函数运行以下数组列表:
ArrayList<Character> test1 = new ArrayList<Character>();
test1.add('a');
test1.add('b');
test1.add('c');
test1.add('a');
test1.add('b');
test1.add('c');
控制台中的输出似乎是:[c,c,b,b,a,a]
我添加了一些控制台打印信息以查看发生了什么,在索引5处似乎拉出了索引2处的项目。因此直到最后,它先删除了索引5然后是2,然后是3然后是1。具有重复的值使函数起作用。拥有多个相同字符似乎是一个问题。
为什么会发生这种情况?
答案 0 :(得分:1)
您正在调用remove
的重载版本,该版本删除了 元素。
当您删除c
时,第三个元素也将被删除。因此,在下一个递归调用中,最后一个元素(c
)仍然存在。
您需要按位置删除元素
array.remove(array.size() - 1);
答案 1 :(得分:0)
我认为您的做法不正确。您创建了太多无用的临时数组。您只需要替换ArrayList
中的各个元素即可。
public static void reverseArray(List<Character> arr, int pos) {
if (arr.isEmpty())
return;
int index = arr.size() - pos - 1;
if (pos >= index)
return;
char ch = arr.get(pos);
arr.set(pos, arr.get(index));
arr.set(index, ch);
reverseArray(arr, ++pos);
}
客户代码:
List<Character> arr = new ArrayList<>();
arr.add('a');
arr.add('b');
arr.add('d');
arr.add('e');
reverseArray(arr, 0);