Eski bir konu olmasına rağmen, başka bir seçenek eklemek zarar vermeyebilir. (JDK 1.8 lambda işlevleri bunu kolaylaştırıyor gibi görünüyor);
Sorun aşağıdaki adımlara bölünebilir;
- Sağlanan tamsayı listesi için minimum bir değer alın (bunun için benzersiz rastgele sayılar üretilir)
- Sağlanan tamsayı listesi için bir maksimum değer alın
- Önceden bulunan minimum ve maksimum tam sayı değerlerine karşı rastgele tamsayı değerleri oluşturmak için ThreadLocalRandom sınıfını (JDK 1.8'den) kullanın ve ardından değerlerin orijinal olarak sağlanan liste tarafından gerçekten içerildiğinden emin olmak için filtre uygulayın. Son olarak, üretilen sayıların benzersiz olduğundan emin olmak için intstream'e farklı uygulayın.
İşte bazı açıklamaları olan işlev:
private List<Integer> getUniqueRandomInts(List<Integer> idList, Integer numberToGenerate) {
List<Integer> generatedUniqueIds = new ArrayList<>();
Integer minId = idList.stream().mapToInt (v->v).min().orElseThrow(NoSuchElementException::new);
Integer maxId = idList.stream().mapToInt (v->v).max().orElseThrow(NoSuchElementException::new);
ThreadLocalRandom.current().ints(minId,maxId)
.filter(e->idList.contains(e))
.distinct()
.limit(numberToGenerate)
.forEach(generatedUniqueIds:: add);
return generatedUniqueIds;
}
Böylece, 'allIntegers' liste nesnesi için 11 benzersiz rasgele sayı elde etmek için, aşağıdaki gibi işlevi çağıracağız;
List<Integer> ids = getUniqueRandomInts(allIntegers,11);
İşlev, yeni arrayList 'createdUniqueIds' bildirir ve dönmeden önce gereken sayıya kadar her benzersiz rasgele tamsayı ile doldurur.
PS ThreadLocalRandom sınıfı, eşzamanlı iş parçacıkları olması durumunda ortak çekirdek değerinden kaçınır.
1..100
(bunun için ünlü algoritmalar vardır), ancak ilkn
öğeleri belirledikten sonra durabilirsiniz .