Java 针对特定范围的元素递归反转arraylist

Java 针对特定范围的元素递归反转arraylist,java,recursion,arraylist,Java,Recursion,Arraylist,我试图递归地反转数组列表中的元素。但是,像1-3中的[1,2,3,4]这样的示例输出返回[4,2,2,4]而不是[1,4,3,2]Change public static void reverse(ArrayList<Integer> numbers, int start, int end) { if (start < end) { int temp = numbers.get(start); numbers.set(numbers.in

我试图递归地反转数组列表中的元素。但是,像1-3中的[1,2,3,4]这样的示例输出返回[4,2,2,4]而不是[1,4,3,2]

Change

public static void reverse(ArrayList<Integer> numbers, int start, int end) {
    if (start < end) {
        int temp = numbers.get(start);
        numbers.set(numbers.indexOf(start), numbers.get(end));
        numbers.set(numbers.indexOf(end), temp);
        reverse(numbers, start + 1, end - 1);
    }
}

开始、结束是列表中要交换值的索引。您不应该调用indexOf来获取索引。indexOf为您传递的值的第一次出现提供索引。

更改

public static void reverse(ArrayList<Integer> numbers, int start, int end) {
    if (start < end) {
        int temp = numbers.get(start);
        numbers.set(numbers.indexOf(start), numbers.get(end));
        numbers.set(numbers.indexOf(end), temp);
        reverse(numbers, start + 1, end - 1);
    }
}

开始、结束是列表中要交换值的索引。您不应该调用indexOf来获取索引。indexOf为您传递的值的第一次出现提供索引。

tl;博士 你工作太辛苦了。无需编写递归反向方法

修改部分列表上的视图会影响原始列表

numbers.set(start, numbers.get(end));
numbers.set(end, temp);
Collections
.reverse(                                // Re-ordering a sublist view affects the original list.
    numbers                              // Your modifiable list of objects (Integer objects in your case). 
    .subList( 1 , 3 + 1 )                // Specify your desired subset that needs reversing, to get a view backed by the original list. Use zero-based index numbers. Add one as the ending is exclusive.
) ;
列表::子列表 调用的结果是直接基于原始列表的该部分的视图。如果更改原始列表,则更改子列表视图

更重要的是,在这里,如果您更改子列表视图,则会更改原始视图。因此,让我们只反转子视图以影响原始视图

当然,这只适用于这样的情况

收藏。反面 要反转列表,请调用实用程序方法

在这两行代码中,我们创建一个列表,获取该列表的一部分的视图,反转该部分中的元素,从而影响原始列表

numbers.set(start, numbers.get(end));
numbers.set(end, temp);
Collections
.reverse(                                // Re-ordering a sublist view affects the original list.
    numbers                              // Your modifiable list of objects (Integer objects in your case). 
    .subList( 1 , 3 + 1 )                // Specify your desired subset that needs reversing, to get a view backed by the original list. Use zero-based index numbers. Add one as the ending is exclusive.
) ;
看这个

数字=[1,2,3,4]

数字=[1,4,3,2]

tl;博士 你工作太辛苦了。无需编写递归反向方法

修改部分列表上的视图会影响原始列表

numbers.set(start, numbers.get(end));
numbers.set(end, temp);
Collections
.reverse(                                // Re-ordering a sublist view affects the original list.
    numbers                              // Your modifiable list of objects (Integer objects in your case). 
    .subList( 1 , 3 + 1 )                // Specify your desired subset that needs reversing, to get a view backed by the original list. Use zero-based index numbers. Add one as the ending is exclusive.
) ;
列表::子列表 调用的结果是直接基于原始列表的该部分的视图。如果更改原始列表,则更改子列表视图

更重要的是,在这里,如果您更改子列表视图,则会更改原始视图。因此,让我们只反转子视图以影响原始视图

当然,这只适用于这样的情况

收藏。反面 要反转列表,请调用实用程序方法

在这两行代码中,我们创建一个列表,获取该列表的一部分的视图,反转该部分中的元素,从而影响原始列表

numbers.set(start, numbers.get(end));
numbers.set(end, temp);
Collections
.reverse(                                // Re-ordering a sublist view affects the original list.
    numbers                              // Your modifiable list of objects (Integer objects in your case). 
    .subList( 1 , 3 + 1 )                // Specify your desired subset that needs reversing, to get a view backed by the original list. Use zero-based index numbers. Add one as the ending is exclusive.
) ;
看这个

数字=[1,2,3,4]

数字=[1,4,3,2]


除了比较“开始”和“结束”的值外,还必须进行如下所示的其他检查,以避免IndexOutOfBoundsException:


@SomeDude已经回答了其余的更正。

除了比较开始和结束的值外,还必须进行如下所示的其他检查,以避免IndexOutOfBoundsException:


其余的更正已经由@SomeDude回答。

为什么要排序?OP想要的只是在两个索引之间反转列表。@somedode我没意识到这一点。我太专注于示例数据了。修订过的。谢谢。如果“递归”不是必需的,这应该是公认的答案。为什么要排序?OP想要的只是在两个索引之间反转列表。@somedode我没意识到这一点。我太专注于示例数据了。修订过的。谢谢。如果“递归”不是必需的,这应该是公认的答案。