【问题标题】:JAVA - For-loop don't create a new arrayJAVA - For-loop 不创建新数组
【发布时间】:2012-04-01 03:08:08
【问题描述】:

有人可以帮我编写以下代码吗?当 for 循环再次执行时,我的 Point2D 临时数组永远不会覆盖前一个数组。

我使用 for 循环来打印数据,以测试临时数组是否发生了变化……当然不会……为什么会发生这样的事情?

Point2D 在不同的类中定义。它的 x、y 和 z 值是公开的。

我认为可能是 .clone() 函数?

谢谢!


Point2D[] pointArr;
pointArr = populateArr(N);  

    for (int i = 0; i < N; i++)
    {
        Point2D[] temp = pointArr.clone();

        if (i >= 0) 
        { 
            Point2D exch = temp[i]; 
            temp[i] = temp[0]; 
            temp[0] = exch;
        //temp[0].z = 0.0;
        }

        System.out.println();

        temp = determine_slopes(temp, N);

        Arrays.sort(temp, temp[0].X_ORDER);

    }

编辑1:只是为了澄清......我实际上希望Point2D []温度随着每次迭代而改变......但由于某种原因它不会改变。可能是什么问题?

编辑 2:我的 pointArr 输出如下:

10000 0 0.0 0 10000 0.0 3000 7000 0.0 7000 3000 0.0 20000 21000 0.0 3000 4000 0.0 14000 15000 0.0 6000 7000 0.0

当我打印时,我在第一次迭代后打印温度,我的输出看起来不像 pointArr 的......它完全不同。

【问题讨论】:

    标签: java arrays for-loop clone


    【解决方案1】:

    数组声明应移出循环。否则,您将在循环的每次迭代中创建一个新的数组实例,覆盖前一个:

    Point2D[] pointArr;
    pointArr = populateArr(N);
    Point2D[] temp = pointArr.clone();  //move to here
    
        for (int i = 0; i < N; i++)
        {
    
    
            if (i >= 0) 
            { 
                Point2D exch = temp[i]; 
                temp[i] = temp[0]; 
                temp[0] = exch;
            //temp[0].z = 0.0;
            }
    
            System.out.println();
    
            temp = determine_slopes(temp, N);
    
            Arrays.sort(temp, temp[0].X_ORDER);
    
        }
    

    编辑: 我不确定这会有所帮助,但请尝试使用循环而不是克隆来创建 pointArr 的副本:

    Point2D[] pointArr;
    pointArr = populateArr(N);
    Point2D[] temp;
    
    for(int i=0; i<pointArr.length; i++)
        pointArr[i]=temp[i];
    

    如您所说,如果您出于某种原因想要覆盖 temp,请将循环等(复制数组)移动到循环中

    【讨论】:

    • 感谢您的帮助!我实际上希望临时数组被覆盖......循环的每次迭代我都想要一个与 pointArr 完全相同的新数组。我更改了我的代码,但它仍然没有覆盖 temp[]
    • 好吧,你正在创建一个 pointArr 的克隆,每次迭代都带有 temp。这意味着它将包含与 pointArr 相同的元素。因此,您每次迭代都会创建一个新数组,这是 pointArr 的副本,并且由于 pointArr 永远不会更改 temp 每次创建时看起来都一样。我不确定你想在这里实现什么:)
    • 这正是我试图实现的目标,但它不起作用......由于某种原因温度没有改变......
    • 嗯,temp 不会改变,因为它是 pointArr 的副本,并且 pointArr 永远不会改变。尝试在每次迭代时向 pointArr 添加一些内容,这些内容也会添加到 temp 中
    • 如果你阅读了clone()的api,它说为了能够调用clone(),对象需要实现Clonable。在此处阅读更多信息docs.oracle.com/javase/1.4.2/docs/api/java/lang/…。不用管这个。在阅读 Point2D 时,它实现了 Clonable(除非您使用自己的 Point2D 实例)
    【解决方案2】:

    这一行应该在for循环之外

    Point2D[] temp = pointArr.clone();
    

    【讨论】:

      【解决方案3】:

      我认为您的问题是每次循环时,您都会将临时数组重新设置为 pointArr 克隆。这就是为什么当您交换值时,每次 b/c 您在临时数组中更改它时它都会丢失,但每次都将临时数组设置为克隆。尝试在 for 循环之外声明您的临时数组。

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 2021-12-15
        • 2011-04-12
        • 2017-03-20
        • 2020-03-10
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2016-04-26
        相关资源
        最近更新 更多