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的解决方案,因为他创建的列表很可能有较低的内存开销。