2009-06-18 19 views
5

Java'da 5 basamaklı int dizisi oluşturmaya çalışıyorum ve nereden başlayacağımı sorun yaşıyorum. Dizideki sayıların hiçbiri çoğaltılamaz. Bunun için rasgele sayılar üretebiliyorum ama sadece sayıları birbiriyle karşılaştırıp herhangi bir kopyasının nasıl değiştirileceğini anlayamıyorum.Yinelenen öğeler için bir dizi öğeyi karşılaştırın

+2

sen '5 haneli int dizisi' ne demek istiyorsunuz? –

cevap

10

Yalnızca benzersiz öğelere sahip olması garantili olduğundan, bir dizi yerine java.util.Set kullanabilirsiniz.

1

bu deneyin:

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

Sen (bu da onları sıralanır) bir TreeSet içine dizi dönüştürerek yinelenenler kurtulabilirsiniz: Ben doğru anlamak

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

, sen Herhangi bir basamak tekrar edilmeden rastgele 5 basamaklı bir sayı mı istiyorsunuz?

Eğer öyleyse, bir yol 0-9 arasındaki basamakların bir listesini karıştırmak, ardından ilk 5 öğeyi seçmek.

DÜZENLEME

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

bu O'da (basamak sayısını), hiçbir iç döngüler, hiçbir üreticimizin < bunu üretir - seçeneklerinin sayısı gerçekten büyük alırsa bu pahalı olabilir

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

Alternatif olarak, diziyi sıralayın ve yineleyin.

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); 
    } 

Ama elbette başlamak için herhangi bir kopya almamak en iyisidir.

0

Her şeyden ötürü yardım ettiğin için teşekkür etmek istiyorum.

İstediğim şekilde çalışmak için bu programı aldım ama daha kolay bir yol olmalı gibi görünüyor. İşte yaptım. Daha fazla yorum harika olurdu.

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

Bak, rastgele sayıları oluştur ve onları boyutu 5'e eşit veya 5'e eşit olan bir Set içine koy. Sonra onları bir arayına vermek için toArray yöntemini çağır. Elbette, Array, Integers içerecektir, ints – Sandman

+0

@sandman: Bunun iyi bir fikir olup olmadığını bilmiyorum, çünkü Set AFAIK elementlerini döndürdüğü sipariş hakkında hiçbir garanti vermez. @John: Bu iş parçacığında önerilen en az iki temizleyici çözüm var mı? –

+0

@sventek: Sayıların sipariş edilmesi gerektiğini farketmedim mi? Bu durumda SortedSet kullanmayı öneriyorum. Bu ekler daha pahalı hale getirir, ama yine de bunun oldukça iyi bir çözüm olduğuna inanıyorum. – 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; 
} 
İlgili konular