0

我是 Java 新手,我一直在编写一个程序来锻炼。Bellow 是该程序的有问题的类。我正在尝试通过数组操作浮点变量,但我似乎无法以这种方式影响它们(例如数组 [i] = 1),我也无法获取它们的值(始终为 0.0),而是直接访问它们(例如变量 = 1 ) 有效。谁能告诉我我做错了什么?谢谢你。

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]);
        }
    }
}
4

5 回答 5

2

在 Java 中,原语(floatint)不能像对象一样被引用,也不能通过引用传递。

statisticsArray不包含对您初始化它的变量的引用,当您执行此调用时,它会在数组内创建变量的副本

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

statisticsArray现在保存switchWin等变量 ( 0) 的默认值。

于 2013-08-22T02:25:46.383 回答
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};
于 2013-08-22T02:38:25.673 回答
0

在您发布的代码中,您在 statisticsArray 中设置值的唯一位置是构造函数(它将 switchWin、switchLose、stayWin、stayLose 的值设置为零)和 reset(),这只是设置值再次归零statisticsArray[i]=0.0f;

在Java中,原始浮点数存储在数组中,它们的值通过引用存储在数组中,所以当你改变引用的值时,数组值不会改变。也就是说,在将 switchWin 存储在数组中之后设置 switchWin=5.0 的值不会将 statisticsArray[0] 的值更改为 5.0。

如果您需要更新数组值,您可以:

  • 添加一个方法syncArray(),它通过调用同步数组中的值,statisticsArray[] = {switchWin, switchLose, stayWin, stayLose, gamesPlayed, switchWinP, ...并且基本上使用更新的方法再次重建数组。不是一个好的解决方案
  • 正如另一位回答者所建议的那样,将所有整数替换为 AtomicInteger 之类的对象类型。
  • 我认为最简单的方法是使用数组索引直接访问所有获取/设置的数组(所以使用statisticsArray[0]而不是 switchWin
于 2013-08-22T02:21:44.147 回答
0

java中的float在这里不是一个对象。所以,当你尝试增加一个浮点值时,它不会改变它自己的浮点数,这意味着:

开关Win++

不会改变 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());
}
于 2013-08-22T02:27:13.773 回答
0

我建议使用 ArrayList。数组很好,但 arraylist 是 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();
  }

  }

请记住,您必须在重置后重新添加值。了解更多信息。

访问 Java API

于 2013-08-22T02:35:21.047 回答