从列表中获取活动对象

时间:2013-03-22 12:24:50

标签: java random

让我们说:

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

其中Item是我的自定义类,它可以有两个状态(布尔值)活动(true)或不活动(false)它有布尔值isActive(),返回当前状态。

现在我要做的是从列表(from 0 to items.size() - 1)接收随机项,但它必须是活动的。

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

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

5 个答案:

答案 0 :(得分:6)

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

List<Integer> indexes = new ArrayList<Integer>(items.size());

for (int i = 0; i < items.size(); i++)
    if (items.get(i).isActive())
        indexes.add(i);

然后,您只需要indexes中的随机元素,并在该特定位置引用Item中的items。所以你的随机活动元素将是

items.get(indexes.get((int)(Math.random() * indexes.size())))

答案 1 :(得分:1)

这取决于活动和非活动项目之间的比率。 如果大多数项目都是活跃的,那么请考虑你的想法,否则你可以找到A.R.S'解决方案。

注意:

重审方法有一个警告。如果所有项目都处于非活动状态,您将最终获得无限循环。

答案 2 :(得分:1)

我认为通过遍历列表并将所有活动项目收集到新列表中,可以为您提供更多控制。

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

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

获得活动项目列表后,从该列表中获取一个随机位置。

答案 3 :(得分:0)

您可以扩展ArrayList并创建一个方法,该方法仅返回活动项目的新ArrayList(或其他Collection)。

class MyItemArrayList扩展了ArrayList {

public ArrayList getActiveItems(){

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

for (Item item : this) {

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



   return activeArrayList;


 }
}

答案 4 :(得分:0)

试试这个:

    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;
            }
        }
    }