如何使ArrayList不是指针

时间:2016-08-31 05:32:01

标签: java pointers arraylist reference

所以,我编写这个程序只是出于概率原因模拟骰子。而且我发现了问题,我知道它在做什么,我只是不知道如何解决它。

主要问题(除了编码不好)是我的succ变量指向或引用了我的points变量。因此,当得到平均值的时候,我得到所有骰子组的高潮的平均值,而不是每个骰子的平均值。清除points变量应该让我从一个新的ArrayList开始,但它也清除了应该在succ中的所有信息

对于有兴趣运行此程序的任何人,请输入这样的dicesets:3d6。这是一个个人选择,我可以让它占任意数量的n面骰子,但为了我的目的,我只需要5个最大值。

import java.util.Random;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;

public class DiceThing {
  static Scanner scan = new Scanner(System.in);
  static int trials;
  static String bleh = new String("hurr");
  static ArrayList < String > dice = new ArrayList < String > ();
  static ArrayList < Integer > roll = new ArrayList < Integer > ();
  static ArrayList < Integer > points = new ArrayList < Integer > ();
  static ArrayList < Integer > num = new ArrayList < Integer > ();
  static ArrayList < Integer > type = new ArrayList < Integer > ();
  static ArrayList < ArrayList < Integer >> succ = new ArrayList < ArrayList < Integer >> ();

  static Random rand = new Random();

  public static void main(String[] args) {
    System.out.println("Enter any number of dicesets. Enter 0 to stop");
    while (!bleh.equals("0")) {
      System.out.println("Enter diceset: ");
      bleh = scan.nextLine();
      if (!bleh.equals("0"))
        dice.add(bleh);
    }

    System.out.println("Enter number of trials: ");
    trials = scan.nextInt();

    for (String i: dice) {
      num.add(Integer.parseInt(i.substring(0, 1)));
      type.add(Integer.parseInt(i.substring(2)));
    }
    for (int i = 0; i < dice.size(); i++) { //count place in dicesets
      for (int j = 0; j < trials; j++) { //count trials
        for (int k = 0; k < num.get(i); k++) //count number of dice in the diceset
          roll.add(rand.nextInt(type.get(i)) + 1);

        points.add(countSuccess(roll, type.get(i)));
        System.out.println(roll.toString() + points.toString());

        roll.clear();
      }
      succ.add(points);
      points.clear();
      System.out.println(succ.toString());
    }

    System.out.println("Average success of dice sets:");
    for (ArrayList < Integer > i: succ) {
      System.out.println(average(i));
    }
  }

  public static int countSuccess(ArrayList < Integer > list, int high) {
    int suc = 0, temp;
    for (int i = 0; i < list.size(); i++) {
      if (list.get(i) >= 5)
        suc++;
      if (list.get(i) == high)
        suc++;
      if (list.get(i) >= 10) {
        temp = rand.nextInt(type.get(i)) + 1;
        roll.add(temp);
        list.add(temp);
      }
    }
    return suc;

  }

  private static double average(ArrayList < Integer > marks) {
    Integer sum = 0;
    if (!marks.isEmpty()) {
      for (Integer mark: marks) {
        sum += mark;
      }
      return sum.doubleValue() / marks.size();
    }
    return sum;
  }
}

虽然起源可能在其他地方,但问题仍然存在。

succ.add(points);
points.clear();
System.out.println(succ.toString());

我可能没有解释得很清楚,如果是这样,请告诉我。任何帮助和解释将不胜感激。

2 个答案:

答案 0 :(得分:1)

succ.add(new ArrayList(points));

如果我理解正确,你想要将列表中的列表与原始列表分开,不是吗?

如果是这样,那么只需创建一个新列表并从原始集合中复制值。构造函数ArrayList(Collection<? extends E> c)将提供帮助。

之后,points.clear()来电不会更改列表中的值 只有succ.get(index).clear()才能清除它。

答案 1 :(得分:0)

我的测试发现了这一点:

succ.add(new ArrayList(points));
points.clear();

假设我理解OP的行为:

  • points是试用成功的ArrayList
  • succ包含每次试用的点数列表