tl;博士
你工作太辛苦了。无需编写递归reverse 方法。
修改列表部分的视图会影响原始列表。
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.
) ;
List::subList
调用List::subList 的结果是直接基于原始列表的该部分的视图。如果更改原始列表,则更改子列表视图。
更重要的是,对于我们这里的目的,如果您更改子列表视图,您就会更改原始视图。所以让我们只反转子视图来影响原始视图。
当然,这只适用于modifiable List,例如ArrayList。
Collections.reverse
要反转列表,请调用实用方法Collections.reverse。
在这两行代码中,我们创建了一个List,获取该列表一部分的视图,反转该部分中的元素,从而影响原始列表。
List < Integer > numbers = new ArrayList <>( List.of( 1 , 2 , 3 , 4 ) );
Collections.reverse( numbers.subList( 1 , 3 + 1 ) ) ;
关于subList 方法的两件事:
- 令人讨厌的参数是从零开始的索引号,而不是序号。
- 它是半开的,意味着开始是包含,而结尾是独占。因此,我们必须在要包含的最后一个元素的索引中添加一个。
示例用法
再次尝试该代码,但添加调用以将列表转储到控制台。
List < Integer > numbers = new ArrayList <>( List.of( 1 , 2 , 3 , 4 ) );
System.out.println( "numbers = " + numbers );
Collections.reverse( numbers.subList( 1 , 3 + 1 ) ) ;
System.out.println( "numbers = " + numbers );
看到这个code run live at IdeOne.com。
数字 = [1, 2, 3, 4]
数字 = [1, 4, 3, 2]