2014-10-30 80 views
-1

我真的不想在网上问这个问题,但我自己弄不明白。当我添加一个新对象时,数组中的所有对象都不断收到“更新”

我正在编写一个Android应用程序,以跟踪一些卡丁车耐力赛的战略(管理驾驶员变化)。我设置了一个Driver对象和一个开始时间(Integer [2]。索引0是小时,索引1是分钟)。对于每个Stint对象(=两个驱动程序更改之间的竞争部分),我设置一个Driver对象和一个开始时间。 每一个stint将被放入一个Stint数组中。

在创建一个新的Stint对象(并将其放入数组的下一个点)后,我转到数组的前一个元素并将其结束时间设置为(新对象的)开始时间,这是构造函数新stint的论点。因此,新stint的startTime =旧stint的结束时间。有道理,对吗?我需要这个来计算持续时间。

但这里是问题: 每次我创建一个新的Stint对象以前的对象的所有开始时间将被覆盖到新的时间。所以当第一个时间点在10:00开始,第二个在10:35开始时,第一个开始时间也是突然的10:35。

我认为这是某种基于参考的问题,但我不理解它。我传递给一个新的Stint对象的Driver对象不会被改变 - 只有开始时间!

这是第一个stint(=比赛开始)的方法。 pickup时间来自Android TimePicker对话框。 cDI - > currentDriverIndex 此时stintIndex为0。

public void createFirstStint(String driver, Integer[] pickedTime) { 

    for (int i = 0; i < AMOUNTOFDRIVERS; i++) { 
     if (driver.equalsIgnoreCase(driverArray[i].getName())) 
      this.cDI = i; 
    } 

    driverArray[cDI].setDriving(true); 
    driverOverviewArray[cDI].setTextColor(Color.GREEN); 

    Stint stint = new Stint(driverArray[cDI], pickedTime); 
    stintArray[stintIndex] = stint; 


} 

这是每个其他stint的方法。基本上是一样的。 pDI - > previousDriverIndex。 这里我创建一个新的Stint对象并放入数组的下一个点(stintIndex ++)。 之后,我转到前一个数组元素[stintIndex -1]并设置结束时间。这有效,但开始时间也会被覆盖。

private void createRegularStint(String driver, Integer[] pickedTime) { 

    stintIndex++; 

    pDI = cDI; 

    for (int i = 0; i < AMOUNTOFDRIVERS; i++) { 
     if (driver.equalsIgnoreCase(driverArray[i].getName())) 
      this.cDI = i; 
    } 

    driverArray[pDI].setDriving(false); 
    driverArray[cDI].setDriving(true); 

    Stint stint = new Stint(driverArray[cDI], pickedTime); 
    stintArray[stintIndex] = stint; 
    stintArray[stintIndex - 1].setEnd(pickedTime, savePrevStintStartTime); // Sets 
                      // also 
                      // the 
    // calculated duration 
    int durationOfLastStint = stintArray[stintIndex - 1] 
      .getDurationMinutes(); 
    driverArray[pDI].setTimeDriven(durationOfLastStint); 
    race.addRaceTime(durationOfLastStint); 

    updateCards(); 

    String s = ""; 
    for (int i = 0; i <= stintIndex; i++) { 
     s += "Stint " + i + "| Start: " 
       + timeMaker(stintArray[i].getStart()) + " Ende: " 
       + timeMaker(stintArray[i].getEnd()) + " Fahrer: " 
       + stintArray[i].getDriver().getName() + "\n"; 

    } 

这是具有当然的所有制定者&干将进站类。 我用999来初始化结束时间,但那只是对我的一些干扰。

public class Stint { 

public Driver driver; 
public Integer[] start; 
public Integer[] end; 
public int durationMinutes; 

public Stint(Driver driver, Integer[] start) { 

    this.driver = driver; 
    this.start = start; 
    this.end = new Integer[2]; 
    end[0] = 999; 
    end[1] = 999; 


} 

/* 
* ************************************************ 
*/ 

public void calcStintDuration(Integer[] savePrevStintStartTime) { 

    int minutes; 

    minutes = end[1] - savePrevStintStartTime[1]; 
    if (minutes < 0) 
     minutes *= (-1); 

    this.durationMinutes = minutes; 

} 

/* 
* GETTER & SETTER********************************* 
*/ 

public void setEnd(Integer[] end, Integer[] savePrevStintStartTime) { 
    this.end = end; 


} 

public Driver getDriver() { 
    return driver; 
} 

public Integer[] getStart() { 
    return start; 
} 

public Integer[] getEnd() { 
    return end; 

} 

public int getDurationMinutes() { 
    return durationMinutes; 
} 

public void setDurationMinutes(int durationMinutes) { 
    this.durationMinutes = durationMinutes; 
} 

/* 
* ************************************************ 
*/ 

}

例如: 当我输入5对不同的他被派驻过(14:00,14点25分,14时39; 15:00,15:15),然后所有先前滨鹬对象将具有开始时间15:15,尽管我在创作之后从未碰过它们。即使当我将Stint类的“开始”变量标记为final时,这种情况仍在继续。

对不起,我不知道为什么这不会做我想做的事情。我也一步一步跟踪调试器,但不知道发生哪部分代码。我希望你能帮助我。

谢谢!

+1

你并没有像你认为的那样添加一个新对象。 – 2014-10-30 14:25:44

+1

,因为它是同一个对象... – Selvin 2014-10-30 14:28:06

+1

欢迎使用java编程。您正在为阵列中的每个元素分配相同的对象引用。这意味着数组中的每个元素都“指向”同一个对象。 – DwB 2014-10-30 14:33:39

回答

0

在Stint构造函数中复制时间。

public class Stint { 
    private Integer[] start; 

    public Stint(Driver driver, Integer[] start) { 
     this.start = Arrays.copyOf[start, start.length]; 
     // ... 
    } 
} 
+0

实际上这并没有改变什么:-(它应该做什么? – Eyntschl 2014-10-30 16:13:52

0

所以我猜以下部分也是错误的?

​​

这意味着Driver对象始终是相同的。

相关问题