【问题标题】:Rotate and return the ArrayList<Integer> in java在 java 中旋转并返回 ArrayList<Integer>
【发布时间】:2022-11-26 13:26:26
【问题描述】:

在下面的程序中,我正在定义数组列表大小为 7 [1,2,3,4,5,6,7] 并向右旋转 3 个位置但是当我打印 numbers1 列表时它给了我预期的答案数字:[5、6、7、1、2、3、4]但是当我返回这个 ArrayList 然后打印它时,它给了我这个答案数字:[2、3、4、5、6、7、1]为什么会这样,请解释。

package QAIntvSprint;

import java.util.ArrayList;
import java.util.Scanner;

public class RotateArray {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int k = sc.nextInt();

    ArrayList<Integer> numbers = new ArrayList<>();

    for (int i = 0; i < n; i++) {
      numbers.add(sc.nextInt());
    }
    rotateArray(numbers, k);
    ArrayList<Integer> ans = rotateArray(numbers, k);
    for (Integer x : ans) {
      System.out.print(x + " ");
    }
  }

  static ArrayList<Integer> rotateArray(ArrayList<Integer> numbers, int k) {
    for (int i = 0; i < k; i++) {
      numbers.add(0, numbers.get(numbers.size() - 1));
      numbers.remove(numbers.size() - 1);
    }
    ArrayList<Integer> numbers1 = numbers;
    System.out.println("numbers: " + numbers1.toString());
    return numbers1;
  }
}

输出

【问题讨论】:

  • 你没有“归还”它……你旋转了 (numbers) 两次! (rotate方法中numbers1的“目的”是什么?;)
  • ans(壮观)..在主要方法中是什么? (您也可以将其重构为 void 方法并在 numbers 上运行;)
  • 你认为你的方法在你的“原始”arraylist [1,2,3,4,5,6,7] 上工作,但是每次调用 rotateArray() 时你的 arraylist 都会被修改。
  • 这与 Java 按值传递有关,如果我的理解是正确的,您的方法会获取对象引用的副本,跟随它到实际对象,并修改那里的值。它不获取传入的数组列表的副本。

标签: java arraylist collections


【解决方案1】:

您正在运行您的功能两次:

rotateArray(numbers, k); // first
ArrayList<Integer> ans = rotateArray(numbers, k); // second

所以数字移动了 6 个位置而不是 3 个位置

此外,你的功能不创造数组的新副本
您返回对相同的数组

ArrayList<Integer> numbers1 = numbers; // copies a reference to an object, not the object itself
return numbers1; // returns the original link

所以我建议像这样重构你的代码:

public class RotateArray {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        
        ArrayList<Integer> numbers = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            numbers.add(sc.nextInt());
        }
        
        // the function will modify the ArrayList by reference, it will change
        rotateArray(numbers, k);
        for (Integer x : numbers) {
            System.out.print(x + " ");
        }
    }
    
    static void rotateArray(ArrayList<Integer> numbers, int k) {
        for (int i = 0; i < k; i++) {
            numbers.add(0, numbers.get(numbers.size() - 1));
            numbers.remove(numbers.size() - 1);
        }
    }
}

【讨论】:

    【解决方案2】:

    那是因为你的函数rotateArray改变了你作为参数给它的数字ArrayList。所以基本上它改变了你的主要方法中的列表(数字)。因为你调用了两次方法,所以数组总和旋转了 6 次(就像你在最终输出中看到的那样)

    如果您不想更改作为参数提供的 ArrayList,您应该执行类似的操作

    ArrayList<Integer> newList = new ArrayList(numbers);
    

    首先在你的 rotateArray 方法中,然后旋转这个列表。

    【讨论】:

      【解决方案3】:

      这里 ArrayList&lt;Integer&gt; ans = rotateArray(numbers, k); 旋转 数字,由上一行返回

      删除 rotateArray(numbers, k);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 2012-08-29
        • 2013-11-16
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多