【问题标题】:Shift elements of array list in javajava中数组列表的移位元素
【发布时间】:2015-11-16 23:39:24
【问题描述】:

所以我试图将一个数组向右移动,以便 x 显示为 4、5、6、7、1、2、3。我认为我的算法是正确的,但由于某种原因它不会返回x 并跳过“x = rotate(x, 3)”行之后的任何内容。任何帮助或解释将不胜感激。

    public class Ex1sub3 {
    public static void main(String[] args){

        double[] x = {1, 2, 3, 4, 5, 6, 7};


        System.out.println("Before rotation: ==============================");
            for (int i = 0; i < x.length; i++)
            {
                System.out.println("x[" + i + "]: " + x[i]);
            }

            x = rotate(x, 3);

            System.out.println("After     rotation:==============================");

                for (int i = 0; i < x.length; i++)
                {
                    System.out.println("x[" + i + "]: " + x[i]);
                } 

    }

    private static double[] rotate(double[] x, int n){
        int l = x.length;

        double [] r = x;

        int c = 0;
        int rotation;
        int startRotation = 0;
        for (c = 0; c < l; c++)
        {
            rotation = c+n;

            while (rotation < l-n)
            {
                x[c] = r[rotation];
            }

            if (rotation >= l-n)
            {
            x[c] = r[startRotation];
            startRotation++;
            }

        }

        return x;
    }

}

【问题讨论】:

    标签: java arraylist elements shift


    【解决方案1】:

    这是调试器可以帮助您查看的地方,但是,一个问题是您正在覆盖要复制到的第一个值而不保留它。例如

    假设你有两个元素,{ 1, 2 } 你做的第一件事是复制x[1] = x[0] 数组是{ 1, 1 } 即你写了一个你不能得到后者的值。相反,您需要保留要复制的值。例如

    double d = x[1]; 
    x[1] = x[0]; 
    x[0] = d;
    

    当您移动 n 时,这会更复杂,但可以做到。一个更简单的解决方案是在旋转之前获取数组的副本。

    【讨论】:

    • 看,我以为我在 r 变量中复制了初始数组,所以初始数组的所有元素都完好无损,可以被 x 访问。我被难住了。
    • @waterytart 在 Java 中,一个对象只有 primitivesreferences。您的t 是对double[]引用,它不是 数组。当您复制 r = t 时,您复制的是引用,而不是数组本身。相反,您可以使用double[] r = t.clone(); 创建一个新数组,该数组是t 的副本,并使r 成为对其的引用。这也是您可以在 IDE 的调试器中看到的内容。
    • @waterytart 同样,当您看到String s 时,您必须告诉自己s 不是字符串,而是对字符串的引用。如果没有这些知识,您将无法理解 s == "Hi" 真正在做什么。即它比较两个对字符串的引用,而不是它们的内容。
    【解决方案2】:

    您的程序不会跳过任何行,但会卡在您的 rotate(...) 函数中。我看不出有任何办法离开内部 while 循环,因为条件中的所有变量在正文中都没有受到影响。但正如@Peter Lawrey 已经提到的那样:调试器可能在程序流神秘的情况下很有用。

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 2012-09-19
      • 1970-01-01
      • 2015-08-04
      • 2011-12-19
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多