Получить активные объекты из списка

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