2013-08-22 83 views
0

我是Java新手,我一直在編寫一個程序來練習。貝婁是該計劃的問題類別。我試圖通過數組操作浮點型變量,但我似乎不能以這種方式影響它們(例如數組[i] = 1),也不能獲得它們的值(總是0.0),但直接訪問它們(例如變量= 1 )的作品。誰能告訴我我做錯了什麼?謝謝。通過Java數組訪問float變量

public class Statistics { 
    private float switchWin, switchLose, stayWin, stayLose, gamesPlayed, switchWinP, switchLoseP, stayWinP, stayLoseP; 
    private float statisticsArray[] = {switchWin, switchLose, stayWin, stayLose, gamesPlayed, switchWinP, switchLoseP, stayWinP, stayLoseP}; 

    public void setSwitchWin() { 
     switchWin++; 
    } 

    public void setSwitchLose() { 
     switchLose++; 
    } 

    public void setStayWin() { 
     stayWin++; 
    } 

    public void setStayLose() { 
     stayLose++; 
    } 

    public void setGamesPlayed() { 
     gamesPlayed++; 
    } 

    public String getSwitchWinPercentage() { 
     return Float.toString(switchWinP = (switchWin/gamesPlayed)*100); 
    } 

    public String getSwitchLosePercentage() { 
     return Float.toString(switchLoseP = (switchLose/gamesPlayed)*100); 
    } 

    public String getStayWinPercentage() { 
     return Float.toString(stayWinP = (stayWin/gamesPlayed)*100); 
    } 

    public String getStayLosePercentage() { 
     return Float.toString(stayLoseP = (stayLose/gamesPlayed)*100); 
    } 

    public String getGamesPlayed() { 
     return Integer.toString((int) gamesPlayed); 
    } 

    public void reset() { 
     for(int i=0; i<statisticsArray.length; i++) { 
      System.out.println(statisticsArray[i]); 
      statisticsArray[i]=0.0f; 
      System.out.println(statisticsArray[i]); 
     } 
    } 
} 
+0

ü應該設置statisticsArray值在所有的二傳手了。 – ggDeGreat

回答

0

你在代碼中設置的statisticsArray值,您發佈的唯一的地方是在構造函數(設置switchWin,switchLose,stayWin,stayLose的價值,......零)和reset()並且這只是將值設置爲零再次與​​

在Java中,原始浮點數存儲在數組中,並且它們的值通過引用存儲在數組中,所以當您更改數組值時不會更改參考值。也就是說,在將switchWin存儲在數組中後,設置switchWin = 5.0的值不會將statisticsArray [0]的值更改爲5.0。

如果你需要更新你可以在你的陣列值:

  • 添加的方法syncArray()通過調用statisticsArray[] = {switchWin, switchLose, stayWin, stayLose, gamesPlayed, switchWinP, ...同步的數組中的值,基本與更新的方法再次重建陣列。 不是一個好的解決方案
  • 作爲另一個回答者建議,用像AtomicInteger這樣的對象類型替換所有的整數。
  • 在我看來,最簡單的方法是直接訪問陣列的所有獲取/設置使用數組索引(因此使用statisticsArray[0]代替switchWin
+0

我使用其他類的setter方法增加變量的值,並使用reset()將值恢復爲零。通過setter方法值增加並返回正常,但statisticsArray []總是返回零並且似乎不會影響變量。 – Sinisa

+0

當您調用setters時,值會更新,但由於Java基元不是通過引用訪問的,所以它不會更新存儲在statisticsArray [] – lreeder

+0

中的值。這就解釋了它。謝謝。 – Sinisa

2

在Java中,基元(floatint等)不能喜歡的對象引用,不按引用傳遞。

statisticsArray不持有參考給您初始化它的變量,它會創建陣列中的變量的副本執行此通話。

private float statisticsArray[] = {switchWin, switchLose, stayWin, [..]}; 

statisticsArray現在保持switchWin等變量(0)的默認值。

0

java中的float不是一個對象。所以,當您嘗試增加一個浮點值,它不會改變浮子它的自我,這意味着:

switchWin ++

不會改變switchWin它的自我,這種操作只是給另一個浮動。

這些代碼會解釋你的問題:

public static void main(String[] args) { 
    int i = 1; 
    int j = 0; 
    j = i; 
    i++; 
    System.out.println(j); 
    System.out.println(i); 
} 

可以使用的AtomicInteger來存儲你的分數,並有一個函數來增加它,像:

public static void main(String[] args) { 
    AtomicInteger ai = new AtomicInteger(0); 
    AtomicInteger[] array = { ai }; 
    System.out.println(array[0].get()); 
    ai.incrementAndGet(); 
    System.out.println(array[0].get()); 
} 
0

我建議使用數組列表。數組很好,但數組列表是Array on Roids。

public class stats{ 

    ArrayList<Float> percent = new ArrayList(); 
    // list the floats 

    public void do(){ 
    for(int i = 0; i < numberofFloats; i++){ 
     percent.add(float); 
    } 
    } 

    public void reset(){ 
    percent.clear(); 
    } 

    } 

記住,您必須在重置後重新添加值。欲瞭解更多信息。

Visit the Java API

+0

是的,我試着用ArrayList,但我有一個「意想不到的價值」問題(如果我記得正確)。 – Sinisa

+0

您是否嘗試在將每個浮點數添加到數組之前對其進行初始化,否則默認情況下爲空,並且浮點數組只接受浮點數不爲空。換句話說,declare,switchWin = o.of; switchLost = 0.0f;等等 – 2013-08-22 03:17:57

1

後您存儲變量數組,數組包含它自己的變量。因此,如果稍後想要更改它們,則無法更改原始變量,因此需要更改該數組中的變量。

像這樣:

public void setSwitchWin() { 
    statisticsArray[0]++; 
} 

public void setSwitchLose() { 
    statisticsArray[1]++; 
} 

public void setStayWin() { 
    statisticsArray[2]++; 
} 

public void setStayLose() { 
    statisticsArray[3]++; 
} 

public void setGamesPlayed() { 
    statisticsArray[4]++; 
} 

private float switchWin, switchLose, stayWin, stayLose, gamesPlayed, switchWinP, switchLoseP, stayWinP, stayLoseP; 
private float statisticsArray[] = {switchWin, switchLose, stayWin, stayLose, gamesPlayed, switchWinP, switchLoseP, stayWinP, stayLoseP}; 

這樣做是沒有意義的,它是一樣的投入:

private float statisticsArray[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};