【问题标题】:Adding multiple "randomly generated" objects to ArrayList results in adding the same object multiple times将多个“随机生成”的对象添加到 ArrayList 会导致多次添加相同的对象
【发布时间】:2019-08-06 12:37:56
【问题描述】:

我有一个类Ttp,它有一个从文件加载的ArrayList<City>。在Ttp 的构造函数中,我随机打乱从文件中读取的列表并将其分配给对象。

public class Ttp {
    private ArrayList<City> cities;

    public Ttp() {
        cities = Utils.shuffleArray(Loader.getCities());
    }
}

这样我得到了 10 个带有很好洗牌数组的对象:

public static void main(String args[]) {
    Loader.readFile("easy_0.ttp");
    for(int i=0; i<10; i++){
        System.out.println(new Ttp());
    }
}

但在这种情况下,当我尝试创建 ArrayList&lt;Ttp&gt; 时,我会得到一个包含相同对象的集合(Ttp 的实例与相同的城市数组)

public static void main(String args[]) {
    Loader.readFile("easy_0.ttp");
    ArrayList<Ttp> arrayList = new ArrayList<>();
    for(int i=0; i<10; i++){
        arrayList.add(new Ttp());
    }
    arrayList.forEach(System.out::println);
}

洗牌功能:

public static <T> ArrayList<T> shuffleArray(ArrayList<T> arrayList) {
    if (arrayList != null && arrayList.size() > 0) {
        int numberOfRolls = Random.getGenerator().nextInt((arrayList.size() - arrayList.size() / 3) + 1) + arrayList.size() / 3;
        int indexA;
        int indexB;
        T objectA;
        for (int i = 0; i < numberOfRolls; i++) {
            indexA = Random.getGenerator().nextInt(arrayList.size());
            indexB = Random.getGenerator().nextInt(arrayList.size());
            objectA = arrayList.get(indexA);
            arrayList.set(indexA, arrayList.get(indexB));
            arrayList.set(indexB, objectA);
        }
    }
    return arrayList;
}

要在随机播放函数中选择随机索引,我使用的是java.util.Random

public class Random {
    private static final java.util.Random generator = new java.util.Random();

    public static java.util.Random getGenerator() {
        return generator;
    }
}

【问题讨论】:

    标签: java arraylist shuffle random


    【解决方案1】:

    如果Loader.getCities() 每次都返回同一个列表,这意味着shuffleArray() 一遍又一遍地改组同一个列表,并且每个Ttp.cities 都引用同一个单一列表。

    解决方法是在某处制作副本。可以在getCities(),也可以在shuffleArray(),也可以在Ttp构造函数中:

    cities = Utils.shuffleArray(new ArrayList<>(Loader.getCities()));
    

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多