-2

我在这个主题上做了很多搜索,但我找不到任何对我的问题有用的东西:我正在基于整数数组用 Java 制作一个简单的记忆游戏。我希望数组只包含重复的条目而没有唯一的条目。不幸的是,这里的大多数问题都是关于避免或删除重复条目,但是如何执行它们呢?

到目前为止,我的代码看起来像这样。

public Field[] getField(){
    Random r = new Random();
    int pool = 16;
    ArrayList<Integer> used = new ArrayList<Integer>();
    int rand = r.nextInt(pool);
    System.out.println("First random: " + rand);

    for(int i = 0; i < fields.length; i++){
        System.out.println("ITERATION " + i + " STARTED");
        while(used.contains(rand)){
            System.out.println(rand + " is used, recalculating...");
            rand = r.nextInt(pool);
            System.out.println("New random is " + rand);
        }

        fields[i] = new Field(rand);
        System.out.println(rand + " added in Field " + i);

        int tmp = r.nextInt(fields.length - 1);
        System.out.println("First tmp calculated: " + tmp);

        while(fields[tmp] != null && i <= fields.length / 2){
            tmp = r.nextInt(fields.length - 1);
            System.out.println("Field " + tmp + " is used, looking for another...");
        }

        fields[tmp] = new Field(rand);
        System.out.println(rand + " added in temp Field " + tmp);

        used.add(rand);
        System.out.println("ITERATION " + i + " ENDED");
        System.out.println();
    }

    return fields;
}

fields[] 是 Field 类型的数组(基本上只有一个成员(int id)。

4

1 回答 1

1

如果我正确理解了您的需求,那么我认为您可能会使这变得比必须的要困难得多。

按顺序fields迭代数组并在每次迭代中添加两个相同的值,然后对数组进行洗牌要容易得多。类似于以下代码:Fields

{
    ...
    for (int i = 0; i < fields.length; i += 2)
        fields[i] = fields[i + 1] = new Field(r.nextInt(pool));

    shuffleFields(fields);

    return fields;
}

您可以选择洗牌算法。Fisher-Yates 洗牌很受欢迎。例如:

void shuffleFields (Field[] fields)
{
    Random r = new Random();
    for (int i = fields.length - 1; i >= 1; --i)
    {
        int j = r.nextInt(i + 1);
        Field t = fields[i];
        fields[i] = fields[j];
        fields[j] = temp;
    }
}
于 2012-06-25T22:32:21.187 回答