如何打印出无重复的随机二维数组?

时间:2014-11-25 14:36:40

标签: java arrays

我的CompSci类有一个我们要做的任务,我们必须打印出一副牌,作为一个二维的6行×8列阵列。每张"卡"基本上是随机生成的数字(1-12)和随机选择的套装(钻石,心形,黑桃和俱乐部);没有卡可以在阵列中的任何地方重复。这是我的代码:

static Random random = new Random(1234567);

static int i = 1;

static int a;
static int d;

static List<String> suits = new LinkedList<String>();

static List<String> cards = new LinkedList<String>();

static int[][] grid = new int[6][8];

public static void main(String[]args)
{
    suits.add("Diamonds");
    suits.add("Clubs");
    suits.add("Hearts");
    suits.add("Spades");

    cards.add("1");
    cards.add("2");
    cards.add("3");
    cards.add("4");
    cards.add("5");
    cards.add("6");
    cards.add("7");
    cards.add("8");
    cards.add("9");
    cards.add("10");
    cards.add("11");
    cards.add("12");

    drawGrid();
}
private static void drawGrid()
{
    for(int b = 0; b < grid.length; b++)
    {
        for(int c = 0; c < grid[i].length; c++)
        {
            a = (int)(Math.floor(suits.size() * Math.random()));
            d = (int)(Math.floor(suits.size() * Math.random()));

            System.out.print(" |" + cards.get(d) + " " + suits.get(a) + "|");

            Collections.shuffle(suits);
            Collections.shuffle(cards);
        }
        System.out.println();
    }
}

3 个答案:

答案 0 :(得分:0)

有不同的方法可以做到这一点。我的第一个想法是创建一个int-arrays列表。

    ArrayList<int[]> list = new ArrayList<int []> ();

    for (int i=0; i<suits.size(); i++)
    {
        for(int j=0; j<cards.size(); j++)
        {
            int[] card = {i,j};
            list.add(card);
        }
    }

    Collections.shuffle(list);

现在每个元素代表一张牌。前6个元素你有6个随机卡。 element [0] = suit和element [1] = cardnumber

答案 1 :(得分:0)

创建一个变量来记住卡片是否已被绘制

static boolean[][] drawn = new boolean[4][13];

然后用以下方法替换您用于绘制卡片的位:

do {
    a = (int)(Math.floor(suits.size() * Math.random()));
    d = (int)(Math.floor(cards.size() * Math.random()));
} while (drawn[a][d]);
drawn[a][d] = true;

最后,删除您正在洗牌两个集合的两行。 Math.random将为您提供随机卡片。

        Collections.shuffle(suits);
        Collections.shuffle(cards);

答案 2 :(得分:0)

你可以做的,是将你之前选择的卡存放在某个位置,这样你就不会有重复的卡片。我相信这会有所帮助:

创建一个集合,让我们称之为 selectedCardMap

static Set<String> selectedCardMap = new HashSet<String>();

让我们替换这两行代码:

a = (int)(Math.floor(suits.size() * Math.random()));
d = (int)(Math.floor(suits.size() * Math.random()));

对于一种方法,它会给你一张新的未使用的卡片,让我们调用这个方法 getNewCard ,在里面,创建你想要获得的相同的随机数,但是这一次,在我们得到它之后,我们检查卡是否被选中,如果是,然后重复并再次检查,直到我们得到一个未选择的卡,如下所示:

public static String getNewCard() {

while (true) {
    int a = (int)(Math.floor(suits.size() * Math.random()));
    int d = (int)(Math.floor(suits.size() * Math.random()));

    //Make a key for the map
    String key= d+"-"+a;


    //check if it was selected
    if (!selectedCardMap.contains(key)) {
       //This card is available, add it to selected and return it!
       selectedCardMap.add(key);
       return " |" + cards.get(d) + " " + suits.get(a) + "|";     
    }
  }
}

在此之后,继续你正在做的任何事情!,对不起,如果有任何代码错误,我只是写了这个没有编译它。但这是代码的主要思想。希望你明白,这对你有用..