java - 如何生成具有一些非常具体约束的数组

标签 java arrays

我想根据一些特定的约束打印 100 个 int 数组。

  1. 每个数组的长度可以从 2 到 10。
  2. 每个数组中的每一项都必须是唯一的
  3. 每个数组中的项目从最低到最高排序
  4. 没有相同的数组,意思是两个数组具有相同的长度和相同的项目

目前我有这段代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;

public class prova {
    public static void main(String[] args) {
        Integer[] elements = new Integer[]{1,2,3,4,5,6,7,8,9,10};

        Set<List<Integer>> seenAlready = new HashSet<>();


        for (int i = 0; i < 100; i++) {
            final Integer[] array = generateRandomArrayFromElements(elements);
            Arrays.sort(array);


            if (seenAlready.add(Arrays.asList(array)))
                System.out.println(Arrays.toString(array));

        }
    }

    private static Integer[] generateRandomArrayFromElements(Integer[] elements) {
        int size = ThreadLocalRandom.current().nextInt(1, elements.length) + 1;
        Integer[] array = new Integer[size];
        ArrayList<Integer> usedIndices = new ArrayList<>(size);
        for (int i = 0; i < array.length; i++) {
            int randomIndex = getUniqueRandomIndex(usedIndices, size);
            usedIndices.add(randomIndex);
            array[i] = elements[randomIndex];
        }
        return array;
    }

    private static int getUniqueRandomIndex(ArrayList<Integer> usedIndices, int max) {
        int randomIndex = ThreadLocalRandom.current().nextInt(0, max);
        final boolean contains = usedIndices.contains(randomIndex);
        if (contains)
            randomIndex = getUniqueRandomIndex(usedIndices, max);
        return randomIndex;
    }
}

问题在于它只会生成彼此之间过于相似的数组。

他们看起来都一样!

看看它可能的输出之一:

[1, 2, 3, 4, 5, 6] 
[1, 2, 3, 4, 5, 6, 7, 8] 
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5]
[1, 2, 3]
[1, 2, 3, 4] 
[1, 2, 3, 4, 5, 6, 7] 
[1, 2] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

我永远不会得到这样的数组:

[3,4,8,9]
[2,3,6,7,8] 

每次他们以 [1,2,3,4] 开始,依此类推!

我不明白!

最佳答案

问题是您正在生成从 0 到 array.length 范围内的索引。

  • 所以如果数组大小是2,那么你的范围是<0,2)
  • 如果数组大小是3,那么你的范围是<0,3)
  • ...
  • 如果数组大小是10,那么你的范围是<0,10)

在那种情况下,无法生成与您向我们展示的结果不同的结果。

Spots to fill  |Elements to choose from based on range
=======================================
[_,_]          |[1,2,................] range <0,2)
[_,_,_]        |[1,2,3,..............] range <0,3)
[_,_,_,_]      |[1,2,3,4,............] range <0,4)
...

您应该像这样调用它 int randomIndex = getUniqueRandomIndex(usedIndices, elements.length);

请注意,max 已更改为 elements.length

关于java - 如何生成具有一些非常具体约束的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41288725/

相关文章:

java - Class API 中的 getDeclaredConstructors 和 getConstructors 有什么区别?

python - 使用 Python numpy where 条件将整体更改为低于特定值

java - 避免 URL 上的音节化

javascript - Highcharts不同数据同图表

java - 通过 GET 方法传递到 Java 中的 RESTful Web 服务时,字符串在 '#' 处被分割

java - 如何从 DatagramPacket 中检索字符串

arrays - 在 O(n) 时间内确定大小为 n 的数组中是否有超过一半的键是相同的键?

java - java-如何在配置文件中设置JDBC连接属性?

ruby-on-rails - 基于循环 block 删除数组元素

python - 在使用 numpy.genfromtxt 创建的 ndarray 中插入列