如何从这两个数组中生成一组设定数量的数字?

问题描述 投票:0回答:2

我在我的项目中定义了String[] private_array;String[] public_array;

private_array是一系列数字,没有固定数量(有时更多数字,有时更少),如[105, 21, 57, 60, 103, 108, 111, 113, 116, 173, 104]

同样,public_array是一系列数字,没有固定数量,如[102, 44, 3]

我想制作一个新的字符串mixture_array,它将包含总共10个非重复数字,由private_arraypublic_array中的数字组成。这些10个数字应首先来自private_array,但如果private_array中的数字少于10个,则来自public_array的数字应该构成差异。

我怎么能这样做?

现在我有两个方法,getPrivateRandomNumbers();getPublicRandomNumbers();,它们给我每个字符串数组的非重复数字。 (但是,如果一个数组包含少于10个数字,我的活动无法正确加载,我确定它与'11'部分有关)

  private Integer[] getPrivateRandomNumbers() {
    HashSet<Integer> integers = new HashSet<>(11);
    Random random = new Random();
    while (integers.size() < 11) {
      // add number generation logic below
      integers.add(Integer.parseInt(private_array[random.nextInt(private_array.length)]));
    }

    private_array_numbers = integers.toArray(new Integer[11]);

    return private_array_numbers;
  }



 private Integer[] getPublicRandomNumbers() {
    HashSet<Integer> integers = new HashSet<>(11);
    Random random = new Random();
    while (integers.size() < 11) {
      // add number generation logic below
      integers.add(Integer.parseInt(public_array[random.nextInt(public_array.length)]));
    }

    public_array_numbers = integers.toArray(new Integer[11]);

    return public_array_numbers;
  }

从上面我可以得到:

mixture_array = (Arrays.toString(private_array_numbers) + Arrays.toString(public_array_numbers));

我怎么能把两个阵列融合在一起,以我想要的方式制作mixture_array

java android arrays random
2个回答
1
投票

正如您已经确定评论中的任何2个数组中都没有重复项,我建议您这样做

  • 首先将两个数组转换为列表,
  • 将它们两者混合以随机顺序获取元素,
  • private_array中的所有shuffeld元素添加到结果列表中,
  • 迭代你的public_array的shuffeld列表,并将每个列表添加到结果列表中(如果它尚不存在)
  • 最后返回一个结果子列表,计算所需的字符串数量。

例:

public static String[] getMixedRandomNumbers(int size) {
    String[] private_array = {"105", "21", "57", "60", "103", "108", "111", "113", "116", "173", "104"};
    String[] public_array  = {"103", "44", "3"};
    List<String> priv = Arrays.asList(private_array);
    List<String> publ = Arrays.asList(public_array);
    Collections.shuffle(priv);
    Collections.shuffle(publ);
    List<String> result = new ArrayList<>();
    result.addAll(priv);
    for(String p : publ){
        if(!result.contains(p)){
            result.add(p);
        }
    }        
    int i = Math.min(size, result.size());
    return result.subList(0, i).toArray(new String[i]);
}

0
投票

这是我的解决方案:

static String[] private_array = new String[]{"105", "21", "21", "21", "21", "21", "60", "103", "108", "111", "111", "116", "173", "104"};

static String[] public_array = new String[]{"103", "44", "104"};

public static void main(String[] args) {

    List<String> privateArr = Arrays.asList(private_array);
    List<String> publicArr = Arrays.asList(public_array);

    List<String> nonDuplicatedPrivate = getNonDuplicated(privateArr, publicArr, new ArrayList<>());
    getNonDuplicated(publicArr, privateArr, nonDuplicatedPrivate);
}

private static List<String> getNonDuplicated(List<String> toIterate, List<String> other, List<String> accumulator) {
    for (int i = 0; i < toIterate.size() && accumulator.size() < 10; i++) {
        String currentElement = toIterate.get(i);
        if (!other.contains(currentElement) && toIterate.indexOf(currentElement) == i && toIterate.lastIndexOf(currentElement) == i) {
            accumulator.add(currentElement);
        }
    }
    return accumulator;
}
© www.soinside.com 2019 - 2024. All rights reserved.