Получить активные объекты из списка
1 Matim [2013-03-22 15:24:00]
Допустим, у нас есть:
private List<Item> items = new ArrayList<Item>();
где Item
- мой пользовательский класс, который может иметь два состояния (логический) активный (истинный) или неактивный (false), он имеет boolean isActive()
который возвращает текущее состояние.
Теперь я пытаюсь получить случайный элемент из списка (from 0 to items.size() - 1)
но он должен быть активным.
То, что я собирался сделать, - это после получения случайного элемента из списка, проверьте, активен ли он, а если нет, до тех пор, пока мы не получим активный элемент, если он активен, верните его, чтобы мы могли его использовать.
Не уверен, что его правильный подход, спасибо.
java random
5 ответов
6 Решение arshajii [2013-03-22 15:29:00]
Проблема, которую я предлагаю с вашим предлагаемым подходом, заключается в том, что при определенных условиях она может стать очень неэффективной, особенно если в вашем списке очень мало активных 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 Parrish Husband [2013-03-22 15:36:00]
Я думаю, что это даст вам больше контроля, итерации по списку и сбора всех активных элементов в новый список.
private List<Item> activeItems = new ArrayList<Item>();
foreach (Item x in items)
{
if (x.Isactive) activeItems.Add(x);
}
Как только вы получите список только активных элементов, получите случайную позицию из этого списка.
1 Klas Lindbäck [2013-03-22 15:34:00]
Это зависит от соотношения между активными и неактивными элементами. Если ожидается, что большинство элементов будут активными, тогда переходите к идее, иначе вы можете пойти на решение ARS.
Заметка:
Существует оговорка с повторным подходом. Если все элементы неактивны, вы получите бесконечный цикл.
0 Jean Waghetti [2013-03-22 15:36:00]
Вы можете расширить ArrayList
и создать метод, который возвращает новый ArrayList
(или, возможно, другую Collection
) только с активными элементами.
класс MyItemArrayList расширяет ArrayList {
public ArrayList getActiveItems() {
ArrayList<Item> activeArrayList = new ArrayList<>();
for (Item item : this) {
if (item.isActive()) {
activeArrayList.add(item);
}
}
return activeArrayList;
}
}
0 Ankur Shanbhag [2013-03-22 15:37:00]
Попробуйте это:
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;
}
}
}