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

时间:2018-11-10 04:27:57

标签: java recursion

我正在研究一个小问题,以使用撤消来反转字符的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。具有重复的值使函数起作用。拥有多个相同字符似乎是一个问题。

为什么会发生这种情况?

2 个答案:

答案 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);