2016-02-28 74 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)來查找重複的元素。