Java 从满足条件的数组中获取随机对象

Java 从满足条件的数组中获取随机对象,java,Java,假设我有两个数组 [1, 2, 3, 4, 5, 6] [真,假,真,假,假,真] 我想从第一个列表中获得一个随机数,但前提是该数字对应于数组中的真值。是否有一种快速、高效的方法可以做到这一点,而对于我的具体情况,它不使用Java.util.Arraylist bool random_condition = false ; int random_index; do { Random random = new Random () ; random_index = random().

假设我有两个数组 [1, 2, 3, 4, 5, 6] [真,假,真,假,假,真]

我想从第一个列表中获得一个随机数,但前提是该数字对应于数组中的真值。是否有一种快速、高效的方法可以做到这一点,而对于我的具体情况,它不使用Java.util.Arraylist

bool random_condition = false ;
int random_index;
do {
    Random random = new Random () ;
    random_index = random().nextInt(7);
    random_condition = condition_array [random_index]
while (random_condition = false);

使用
condition\u array=[true,false,true,false,false-true]

您可以使用IntStream.filter仅获取true值,并从该数组中获取随机值。如果您需要获得多个随机数,这将大大提高效率

int[] arr = {1, 2, 3, 4, 5, 6};
boolean[] good = {true, false, true, false, false true};
int[] choices = IntStream.range(0, arr.length).filter(i->good[i]).map(i->arr[i]).toArray();
int randVal = choices[(int)(Math.random()*choices.length)];
import java.util.Vector;
导入java.util.concurrent.ThreadLocalRandom;
公共静态int getRandomInt(){
int[]intArray={1,2,3,4,5,6};
布尔[]boolArray={true,false,true,false,false,true};
向量选择=新向量();
for(int i=0;i
这是一个线性解决方案,可以避免
java.util.ArrayList

也就是说,有更好的方法可以在不使用两个单独数组的情况下实现这一点,因此我建议重新评估您的设计。

这可能需要无限长的时间。我在寻找一个相对快速的解决方案,这是很好的,但是,我试图只得到一个单一的数字once@Bykaugan我不明白你的评论?这个答案怎么解决不了你的问题?@hev1不是这个答案的复杂性O(n),n是arr.length吗?@EEAH是的,是的。为什么?@hev1只是想知道是否有另一个解决方案具有较低的复杂性,因为这个解决方案总是循环n次(在最坏和最好的情况下都是O(n))。可以选择一个随机索引
k
,并检查
good[k]==true
,同时跟踪已检查的索引(在最坏情况下仍然具有线性时间复杂度O(n),但在最佳情况下为O(1))。
import java.util.Vector;
import java.util.concurrent.ThreadLocalRandom;

public static int getRandomInt() {
    int[] intArray = {1, 2, 3, 4, 5, 6};
    boolean[] boolArray = {true, false, true, false, false, true};
    Vector<Integer> choices = new Vector<>();
    for (int i = 0; i < boolArray.length; i++) {
        if (boolArray[i]) {
            choices.add(intArray[i]);
        }
    }
    return choices.get(ThreadLocalRandom.current().nextInt(0, choices.size()));
}