如何生成具有一些非常特定约束的数组

时间:2016-12-22 17:27:08

标签: java arrays

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

  1. 每个数组的长度可以从2到10。
  2. 每个数组中的每个项目都必须是唯一的
  3. 每个数组中的项目从最低到最高
  4. 排序
  5. 没有相同的数组,这意味着两个数组具有相同的长度和相同的项目
  6. 目前我有这段代码

    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]开头等等!

    我不明白!

2 个答案:

答案 0 :(得分:4)

问题在于您生成的索引范围为0到array.length。

  • 因此,如果数组大小为2,那么您的范围是&lt; 0,2)
  • 如果数组大小为3,那么您的范围是<0,3)
  • ...
  • 如果数组大小为10,那么您的范围是&lt; 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

答案 1 :(得分:0)

1 - 开始生成100个空数组,其长度从2到10不等。

2 - 计算总大小。

3 - 生成x uniques整数并将它们添加到Set。

Set<Integer> set = new HashSet<Integer>();
    while(set.size()< xxx) {
        set.add(generateRandomInteger());
    }

    Collections.sort(set);

(其中xxx是总数组大小

4 - 将整数添加到数组中。