Сравните элементы в массиве для дубликатов

Другой альтернативой является использование гема full_dup (полное раскрытие: я являюсь автором этого драгоценного камня), который обрабатывает массивы, хэши, структуры и может быть расширен до пользовательских классов.

Использовать:

require 'full_dup'
# Other code omitted ...
d = h.full_dup

Также обратите внимание, что full_dup обрабатывает сложные отношения данных, в том числе с циклами или рекурсией.

5
задан H.Muster 21 February 2013 в 13:13
поделиться

7 ответов

Вы можете использовать java.util.Set вместо массива, поскольку он гарантированно содержит только уникальные элементы.

10
ответ дан 18 December 2019 в 07:56
поделиться

Если я вас правильно понял, вам нужно случайное пятизначное число, без повторения цифр?

Если да, то один из способов - перетасовать список цифр 0–9, а затем выберите первые 5.

РЕДАКТИРОВАТЬ

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]);
}
4
ответ дан 18 December 2019 в 07:56
поделиться

Вы можете избавиться от дубликатов, преобразовав массив в TreeSet (который также отсортирует их):

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);
2
ответ дан 18 December 2019 в 07:56
поделиться

он генерирует его в 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;
}
2
ответ дан 18 December 2019 в 07:56
поделиться

попробуйте следующее:

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;
}
1
ответ дан 18 December 2019 в 07:56
поделиться

В качестве альтернативы просто отсортируйте массив и повторите его.

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

Но, конечно, лучше не создавать дубликаты для начала.

1
ответ дан 18 December 2019 в 07:56
поделиться

Прежде всего, я хочу поблагодарить всех вас за помощь, я очень ценю это.

Я заставил эту программу работать так, как я хочу, но, похоже, должен быть более простой способ. Вот что я сделал. Любые дополнительные комментарии были бы потрясающими.

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
ответ дан 18 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: