2017-01-20 9 views
1

Мне нужно многократно генерировать массив целых чисел в случайном порядке в Java. Я придумал следующий уродливый фрагмент (который работает в большем цикле). Что более эффективный или компактный способ сделать то же самое?Компактный код перетасовки в Java

ArrayList<Integer> t = new ArrayList<>(); 
    int[] d = new int[elts]; 
    for (int i = 0; i < elts; i++) { 
     t.add(i); 
    } 
    Collections.shuffle(t); 
    for (int i = 0; i < elts; i++) { 
     d[i] = t.get(i); 
    } 
+0

http://stackoverflow.com/questions/20058366/shuffle-a-list-of-integers-with-java-8-streams-api – hoat4

+0

http://stackoverflow.com/questions/1519736/random-shuffling-of-a-array –

ответ

3

Использование Java 8 Стрим API:

List<Integer> list = IntStream.range(0, elts).boxed().collect(toList()); 
    Collections.shuffle(list); 
    int[] d = list.stream().mapToInt(i -> i).toArray(); 
1

будет хорошо работать в Java 8

List<Integer> range = IntStream.range(0, elts).boxed().collect(Collectors.toList()); 
Collections.shuffle(range); 
Integer[] arr = new Integer[elts]; 
range.toArray(arr); 
+0

@Downvoter: помогите объяснить? – ares

+0

Дубликат, две последние строки могут быть объединены, вопрос имеет int [], а не Integer [], и использовать массивы нулевого размера с помощью toArray (https://shipilev.net/blog/2016/arrays-wisdom-ancients/) , – hoat4

2

То же самое с Java 8 Стрим API, но с использованием collectAndThen()

IntStream.range(0, elts). // range from 0 to elts 
     boxed(). // from int to Integer 
     collect(collectingAndThen(toList(), integers -> { //collect to list 
      Collections.shuffle(integers); //shuffle integer 
      return integers.toArray(new Integer[integers.size()]); // convert list to array 
     })); 

и с StreamEx

int[] ints = IntStreamEx.range(0, elts) 
      .sorted((o1, o2) -> random.nextInt()) 
      .toArray();