2014-10-30 77 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對象始終是相同的。

相關問題