2016-02-28 277 views
-1

在此代码中,我从数组中找到了重复项,我想将其删除。输出然后将是唯一生成的数字。我需要使用math.random和模。任何人有任何线索?我尝试将它们存储在一个数组中,但原始数组的值为0,0是我的随机数生成域(从0到52)的一部分。如何使用for循环删除数组中的重复项

public class Decks { 

public static void main(String[] args) { 

generate(); 

} 

public static void generate() { 
int deckOfCard[] = new int[52]; 

for (int counts = 0; counts < 52; counts++) { 

    deckOfCard[counts] = (int) (Math.random() * 51); 

} 

for (int i = 0; i < deckOfCard.length - 1; i++) { 

    for (int j = i + 1; j < deckOfCard.length; j++) { 

     if ((deckOfCard[i] == (deckOfCard[j])) && (i != j)) { 

      System.out.println("DUPLICATE " + deckOfCard[i]); 

     } 
    } 
} 

for (int count = 0; count < deckOfCard.length; count++) { 

    System.out.print("\t" + deckOfCard[count]); 

} 
} 
+0

您可以使用List,使用负数表示“已移除”的卡片,或将这些值保存到新数组中。 – Fang

+0

是你的目标:首先生成52个数字,然后删除重复项?或者,生成52个“唯一”号码? – Scar

+0

我的目标是生成52个唯一的数字,但我必须使用math.random和modulus来创建它们并将它们存储在数组中。 –

回答

0

必须验证号码时产生随机数产生这样的:

import java.util.Random; 
public class Decks { 
    public static void main(String[] args) { 

     Random myRandom = new Random(); 

     int[] num = new int[53]; 

     boolean[] check = new boolean[53]; 
     int all = 0; 
     int ranNum; 

     while (all < 53) { 
      ranNum = myRandom.nextInt(53); 
      if (!check[ranNum]) { 
       check[ranNum] = true; 
       num[all] = ranNum; 
       all++; 
      } 
     } 
     for (int i = 0; i < 53; i++) { 
      System.out.println(num[i]); 
     } 
    } 
} 

我建议还不包括数量0,因为它不以卡真正的甲板存在(ACE作为最低的数字值为1)。我只是把它包含在这里,因为在我的理解中,0包含在你想要的输出中。

+0

谢谢你,经过数小时的努力,这仍然是最好的方式。 –

+0

很高兴帮助你。请选择此作为答案 – Scar

1

为什么不尝试使用HashSet而不是数组?正如你所知道的集只存储独特的价值,所以你不会有任何重复。

+0

很好的建议,但我必须遵循我的愚蠢课程的指导,这是完全低效的这个任务。我必然要数组和使用模数... –

+0

在这种情况下,您可以创建一个大小为52的新数组uniqueElem并初始化所有索引为-1。 现在对于deckOfCard [i]中的每个元素,将元素存储为使得'uniqueElem [deckOfCard [i]] = deckOfCard [i]' 因此,您的uniqueElem将如下所示: ** { - 1,-1 ,-1,........ -1 -1} ** 更新uniqueElem后,它将如下所示: ** { - 1,-1,2,-1,... ... -1,51} ** –

0

考虑到时间复杂性,您可以先对它们进行排序,最好的情况下需要nlogn时间,然后使用O(1)来查找重复的元素。