【问题标题】:Reverse an arraylist recursively for a specific range of elements针对特定范围的元素递归地反转数组列表
【发布时间】:2020-04-30 00:59:39
【问题描述】:
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);
    }
}

我正在尝试递归地反转数组列表中的元素。但是示例输出如:[1, 2, 3, 4] from 1-3 返回 [4, 2, 2, 4] 而不是:[1, 4, 3, 2]

【问题讨论】:

    标签: java recursion arraylist


    【解决方案1】:

    改变

    numbers.set(numbers.indexOf(start), numbers.get(end));
    numbers.set(numbers.indexOf(end), temp);
    

    numbers.set(start, numbers.get(end));
    numbers.set(end, temp);
    

    startend 是列表中要交换值的索引。你不应该打电话给indexOf 来获取索引。 indexOf 为您提供传入值的第一次出现的索引。

    【讨论】:

      【解决方案2】:

      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]

      【讨论】:

      • 为什么要排序? OP 想要的只是反转两个索引之间的列表。
      • @SomeDude 我没有意识到那部分。我太专注于示例数据。修改。谢谢。
      • 如果“递归”不是必需的,这应该是公认的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 2015-12-03
      • 2012-10-20
      • 2020-11-17
      • 1970-01-01
      • 2019-07-25
      • 2020-03-22
      相关资源
      最近更新 更多