2009-06-18 22 views
5

Javaで5桁のint配列を生成しようとしていますが、開始する場所に問題があります。配列内の数字のいずれも重複することはできません。私はそれのための乱数を生成することができますが、ちょうどカンニングは、お互いに数を比較し、任意の重複を置き換える方法を見つける。配列内の要素を重複して比較する

+2

あなたは '5桁のint配列' とはどういう意味ですか? –

答えて

10

配列の代わりにjava.util.Setを使用すると、一意の要素のみを持つことが保証されます。

1

この試してください:あなたは(それはまた、それらをソートします)TreeSetのに配列を変換することにより、重複を取り除くことができ

int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
Random random = new Random(); 

int[] generateId() { 
    int[] clone = digits.clone(); 
    int[] id = new int[5]; 

    for (int i = 0; i < 5; i++) { 
     int candidate; 

     do { 
      candidate = random.nextInt(10); 
     } while (clone[candidate] == -1); 

     id[i] = clone[candidate]; 
     clone[candidate] = -1; 
    } 

    return id; 
} 
2

を:

int numbers[] { 4 5 7 6 5 7 5 89 847 7 94 093 02 10 11 10 11 }; 
TreeSet set new TreeSet(Arrays.asList(numbers)); 
for (int no : set) 
    System.out.println(no); 
4

私が正しくあなたを理解していれば、あなたは5桁のランダムな数字が必要ですが、数字は何も繰り返されません。

もしそうなら、数字のリストをシャッフルしてから、最初の5つの要素を選んでください。

EDIT

Integer[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
Random random = new Random(); 

public Integer[] generateId() { 
    List<Integer> id = Arrays.asList(digits); 
    Collections.shuffle(id, random); 
    return id.subList(0, 5).toArray(new Integer[0]); 
} 
2

これはOでそれを生成する(桁数)、無内部ループ、ノーシャッフル< - 選択肢の数は、本当に大きな

int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
Random random = new Random(); 

int[] generateId() { 
    int[] choices = digits.clone(); 
    int[] id = new int[5]; 

    for (int i = 0; i < 5; i++) { 
     // one less choice to choose from each time 
     int index = random.nextInt(choices.length - i); 
     id[i] = choices[index]; 
     // "remove" used item by replacing it with item at end of range 
     // because that index at the end won't be considered in next round 
     choices[index] = choices[choices.length - i - 1]; 
    } 

    return id; 
} 
を取得する場合、これは高価になる可能性があります
1

代わりに、配列をソートしてそれを反復するだけです。

List<int> myList = new List<int>() { 1, 1, 2, 3, 4, 5, 5, 7 , 1, 7}; 
    myList.Sort(); 
    for (int i = myList.Count - 1; i > 0; i--) 
    { 
     if (myList[i] == myList[i - 1]) 
      myList.RemoveAt(i); 
    } 

もちろん、最初に重複を取得しないことをお勧めします。

0

まずは本当に感謝してくれた皆様に感謝します。

私はこのプログラムを私が望むやり方で動かすことができましたが、より簡単な方法があるはずです。ここに私がしたことがあります。それ以上のコメントはすばらしいでしょう。

do 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      iNumber = generator.nextInt(9) + 1; 
      numbers[i] = iNumber; 
     } 
    } 
    while(numbers[0] == numbers[1] || numbers[0] == numbers[2] || numbers[0] == numbers[3] || numbers[0] == numbers[4] || numbers[1] == numbers[2] || numbers[1] == numbers[3] || numbers[1] == numbers[4] || numbers[2] == numbers[3] || numbers[2] == numbers[4] || numbers[3] == numbers[4]); 
+0

ちょうど乱数を生成し、それがサイズが5以下である間にSet に入れてください。そしてそれをtoArrayメソッドと呼んで、それらをarayにエクスポートします。もちろん、配列にはintではなく整数が含まれます – Sandman

+0

@sandman:SetはAFAIKという要素を返す順序についてSetが保証しないので、それが良いかどうかわかりません。 @ジョン:このスレッドでは少なくとも2つのクリーナーソリューションが提案されていますか? –

+0

@sventek:番号を注文しなければならないことは分かりませんでしたか?その場合は、SortedSetを使用することをお勧めします。それはインサートをより高価にしますが、これはかなり良い解決策だと私はまだ信じています。 – Sandman

0
/** 
* findDuplicate method return map where key is unique no and value as the 
* repitation 
* 
* @param a 
*   : arrays of Objects 
* @return map 
*/ 
public Map findDuplicate(T[] a) { 
    Map<T, Integer> map = new HashMap<T, Integer>(); 
    Set<T> unique = new HashSet<T>(Arrays.asList(a)); 
    int count = 0; 
    for (T integer : unique) { 
     for (T integer1 : a) { 
      if (integer == integer1) { 
       ++count; 
      } 
     } 
     map.put(integer, count); 
     count = 0; 
    } 

    return map; 
} 
関連する問題