Java中的紧凑混洗代码

时间:2017-01-20 20:08:30

标签: java collections shuffle

我需要在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);
    }

3 个答案:

答案 0 :(得分:3)

使用Java 8 Stream API:

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

答案 1 :(得分:2)

与Java 8 Stream 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();

答案 2 :(得分: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);