让我们说:
private List<Item> items = new ArrayList<Item>();
其中Item
是我的自定义类,它可以有两个状态(布尔值)活动(true)或不活动(false)它有布尔值isActive()
,返回当前状态。
现在我要做的是从列表(from 0 to items.size() - 1)
接收随机项,但它必须是活动的。
我想要做的是在从列表中获取随机项后,检查它是否有效,如果没有,请重复直到我们收到活动项,如果它处于活动状态,则返回它以便我们可以使用它。
不确定它是否正确,谢谢。
答案 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;
}
}
}