Java ArrayList项索引不正确:使用递归反转ArrayList

Java ArrayList项索引不正确:使用递归反转ArrayList,java,recursion,Java,Recursion,我正在研究一个小问题,使用递归反转字符数组列表。我已经基本解决了这个问题,但目前在通过索引检索项目时遇到了一些问题 我的职能如下: public static ArrayList<Character> reverseArray(ArrayList<Character> array){ if (array.size() == 1){ return array; } // Fetched the last item

我正在研究一个小问题,使用递归反转字符数组列表。我已经基本解决了这个问题,但目前在通过索引检索项目时遇到了一些问题

我的职能如下:

    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;

}
publicstaticarraylistreversearlay(arraylistarray){
if(array.size()==1){
返回数组;
}
//已获取最后一项
ArrayList lastItem=新的ArrayList();
System.out.println(“索引:”+(array.size()-1));
System.out.println(“索引处的项:”+(array.size()-1)+”是:“+array.get((array.size()-1)));
add(array.get(array.size()-1));
//删除最后一项
remove(array.get(array.size()-1));
//加入所有数组,直到最后一个条目
addAll(reversearlay(数组));
返回最后一项;
}
通过函数运行以下数组列表:

    ArrayList<Character> test1 = new ArrayList<Character>();
    test1.add('a');
    test1.add('b');
    test1.add('c');
    test1.add('a');
    test1.add('b');
    test1.add('c');
arraylisttest1=newarraylist();
测试1.添加('a');
测试1.添加('b');
测试1.添加('c');
测试1.添加('a');
测试1.添加('b');
测试1.添加('c');
控制台中的输出似乎是:[c,c,b,b,a,a]

我添加了一些控制台打印以查看发生了什么,在索引5处,它似乎在索引2处拉动项目。因此,直到最后,它删除了索引5,然后是2,然后是3,然后是1。将输入数组更改为不具有重复值可以使函数正常工作。这似乎是一个具有多个相同字符的问题


你知道为什么会发生这种情况吗?

你正在调用重载版本的
remove
,该版本将删除元素

删除
c
时,第三个元素将被删除。因此,在下一个递归调用中,最后一个元素(
c
)仍然保留

您需要按位置删除元素

array.remove(array.size() - 1);

我认为你做得不对。您创建了太多无用的临时数组。只需替换
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);
}
public静态无效反向通道(列表arr、int pos){
if(arr.isEmpty())
回来
int index=arr.size()-pos-1;
如果(位置>=索引)
回来
char ch=arr.get(位置);
arr.set(pos,arr.get(index));
arr.set(索引,ch);
反向耳道(arr,++位置);
}
客户端代码:

List<Character> arr = new ArrayList<>();
arr.add('a');
arr.add('b');
arr.add('d');
arr.add('e');

reverseArray(arr, 0);
List arr=new ArrayList();
arr.add('a');
arr.add('b');
arr.add('d');
arr.add('e');
反向耳道(arr,0);

完美!我没听清楚。非常感谢。