Sebbene sia un vecchio thread, l'aggiunta di un'altra opzione potrebbe non essere dannosa. (Le funzioni lambda JDK 1.8 sembrano renderlo facile);
Il problema potrebbe essere suddiviso nei seguenti passaggi;
- Ottieni un valore minimo per l'elenco fornito di numeri interi (per i quali generare numeri casuali univoci)
- Ottieni un valore massimo per l'elenco di numeri interi fornito
- Utilizzare la classe ThreadLocalRandom (da JDK 1.8) per generare valori interi casuali rispetto ai valori interi minimo e massimo trovati in precedenza e quindi filtrare per assicurarsi che i valori siano effettivamente contenuti nell'elenco fornito originariamente. Infine applica distinto all'intstream per garantire che i numeri generati siano univoci.
Ecco la funzione con qualche descrizione:
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;
}
Quindi, per ottenere 11 numeri casuali univoci per l'oggetto elenco 'allIntegers', chiameremo la funzione come;
List<Integer> ids = getUniqueRandomInts(allIntegers,11);
La funzione dichiara new arrayList 'generatedUniqueIds' e viene popolata con ogni numero intero casuale univoco fino al numero richiesto prima di restituire.
La classe PS ThreadLocalRandom evita il valore di inizializzazione comune in caso di thread simultanei.
1..100
(ci sono algoritmi famosi per questo), ma fermati dopo aver determinato i primin
elementi.