Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从列表中获取活动对象_Java_Random - Fatal编程技术网

Java 从列表中获取活动对象

Java 从列表中获取活动对象,java,random,Java,Random,假设我们有: private List<Item> items = new ArrayList<Item>(); 其中Item是我的自定义类,它可以有两种状态boolean active true或not active false它有boolean isActive返回当前状态 现在我要做的是从列表中接收从0到items.size-1的随机项,但它必须处于活动状态 我想做的是在从列表中获取随机项后,检查它是否处于活动状态,如果不是,重复直到我们收到活动项,如果它处于活动

假设我们有:

private List<Item> items = new ArrayList<Item>();
其中Item是我的自定义类,它可以有两种状态boolean active true或not active false它有boolean isActive返回当前状态

现在我要做的是从列表中接收从0到items.size-1的随机项,但它必须处于活动状态

我想做的是在从列表中获取随机项后,检查它是否处于活动状态,如果不是,重复直到我们收到活动项,如果它处于活动状态,返回它以便我们可以使用它


不确定它是否正确,谢谢。

我对您建议的方法的问题是,在某些情况下,它可能会变得非常低效,特别是当您的列表中只有很少的活动项时。另一个想法是创建一个新列表,其中包含项目列表中所有活动项目的索引:


我对您建议的方法存在的问题是,在某些情况下,它可能会变得非常低效,特别是当您的列表中只有很少的活动项时。另一个想法是创建一个新列表,其中包含项目列表中所有活动项目的索引:


这取决于活动项和非活动项之间的比率。 如果大多数项目都是活动的,那么就按照你的想法去做,否则你可以使用A.R.S.的解决方案

注:


重试方法有一个警告。如果所有项目都处于非活动状态,则最终将出现无限循环。

这取决于活动项目和非活动项目之间的比率。 如果大多数项目都是活动的,那么就按照你的想法去做,否则你可以使用A.R.S.的解决方案

注:

重试方法有一个警告。如果所有项目都处于非活动状态,则最终将出现一个无限循环。

您可以扩展ArrayList并创建一个方法,该方法返回一个新的ArrayList或其他可能仅包含活动项目的集合

类MyItemArrayList扩展了ArrayList{

公共ArrayList getActiveItems{

ArrayList<Item> activeArrayList = new ArrayList<>();

for (Item item : this) {

    if (item.isActive()) {
        activeArrayList.add(item);
    }
}



   return activeArrayList;


 }
}
您可以扩展ArrayList并创建一个方法,该方法返回一个新的ArrayList或其他可能仅包含活动项的集合

类MyItemArrayList扩展了ArrayList{

公共ArrayList getActiveItems{

ArrayList<Item> activeArrayList = new ArrayList<>();

for (Item item : this) {

    if (item.isActive()) {
        activeArrayList.add(item);
    }
}



   return activeArrayList;


 }
}

我认为,通过遍历列表并将所有活动项收集到一个新列表中,它将为您提供更多的控制

private List<Item> activeItems = new ArrayList<Item>();

foreach (Item x in items)
{
    if (x.Isactive) activeItems.Add(x);  
}

一旦你得到了只包含活动项的列表,就可以从该列表中获得一个随机位置。

我认为,通过迭代列表并将所有活动项收集到一个新列表中,它会给你更多的控制

private List<Item> activeItems = new ArrayList<Item>();

foreach (Item x in items)
{
    if (x.Isactive) activeItems.Add(x);  
}
一旦你得到了仅有活动项的列表,从该列表中随机获得一个位置。

试试以下方法:

    List<CustomClass> list = new ArrayList<CustomClass>();


    Random random = new Random();


    while (true) {
        int nextInt = random.nextInt();
        if (nextInt > 0 && nextInt <= list.size()) {
            if(list.get(nextInt).isActive()){
                // Current state is active
                System.out.println("Found active");
                break;
            }
        }
    }
试试这个:

    List<CustomClass> list = new ArrayList<CustomClass>();


    Random random = new Random();


    while (true) {
        int nextInt = random.nextInt();
        if (nextInt > 0 && nextInt <= list.size()) {
            if(list.get(nextInt).isActive()){
                // Current state is active
                System.out.println("Found active");
                break;
            }
        }
    }

听起来是正确的方法。你有一些代码要共享吗?听起来是正确的方法。你有一些代码要共享吗?虽然我更喜欢ARS的解决方案,因为他创建的列表很可能有较低的内存开销。虽然我更喜欢ARS的解决方案,因为他创建的列表很可能有较低的内存开销。