Как я могу выбрать случайный элемент из ArrayList, если он меняет размер? - PullRequest
0 голосов
/ 10 декабря 2018

В моем коде "count0", "count1" и "count2" получают случайные значения, а "totalCount" является их суммой.Здесь я упростил это.

С помощью этого кода я могу выбрать случайный элемент ArrayList, но если, например, «count0» равен 0, он удалит индекс 0 из ArrayList не только в первый раз, нокаждая итерация, вызывая ошибку, если это произойдет.Идея состоит в том, как случайным образом выбрать ингредиенты из кладовой, и когда один из них исчерпан, вы все равно можете выбрать из остальных.

Спасибо за помощь =)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class RndNumArray {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        int totalCount=4, count0=1, count1=1, count2=2;
        Random rnd = new Random();
        ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(0, 1, 2));

        while(totalCount > 0){

            int rand = rnd.nextInt(numbers.size());
            int num = numbers.get(rand);
            if (num == 0) {
                count0--;
                if (ccount0 == 0) {
                    numbers.remove(0);
                }
            }
            if (num == 1) {
                count1--;
                if (count1 == 0) {
                    numbers.remove(1);
                }
            }
            if (num == 2) {
                count2--;
                if (count2 == 0) {
                    numbers.remove(2);
                }
            }
            totalCount--;
            System.out.println(num);
        }
    }    
}

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Спасибо, ребята.Вы, ребята, великолепны.Я попробую все ваши предложения, но я нашел решение, которое работает.Вместо того, чтобы удалять элементы из списка, я дал им значение, которым я буду управлять в течение некоторого времени, чтобы вы выбирали только доступные.

Мой код является модификацией проблемы курения (темы исинхронизации).В моем коде у каждого курильщика есть определенное количество сигар, и он может закончить раньше остальных, поэтому агент не должен ставить ингредиенты для него.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class RndNumArray {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

    int totalCount=4, count0=1, count1=1, count2=2;
    Random rnd = new Random();
    ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(0, 1, 2));

    while(totalCount>0){
        int rand;
        int num;

        do{
        rand = rnd.nextInt(numbers.size());
        num = numbers.get(rand);
        } while(num==3);

        if (num == 0) {
            count0--;
            if (ccount0 == 0) {
                numbers.set(0,3);
            }
        }
        if (num == 1) {
            count1--;
            if (count1 == 0) {
                numbers.set(1,3);
            }
        }
        if (num == 2) {
            count2--;
            if (count2 == 0) {
                numbers.set(2,3);
            }
        }
        totalCount--;
        System.out.println(num);
    }
    }    
}
0 голосов
/ 10 декабря 2018

Используйте два списка количества (сколько продуктов у вас есть) и числа (номер продукта):

public static void main(final String[] args)
{
    final int totalCount = 4;
    final Random rnd = new Random(); 
    final List<Integer> numbers = new ArrayList<>(Arrays.asList(0, 1, 2));
    final List<Integer> counts = new ArrayList<>(Arrays.asList(1, 1, 2));

    for (int i = 1; i < totalCount; i++)
    {
        final int rand = rnd.nextInt(numbers.size());
        final int num = numbers.get(rand);
        int count = counts.get(rand);
        count--;
        if (count < 1)
        {
            numbers.remove(rand);
            counts.remove(rand);
        }else
        {
            counts.set(rand, count);
        }
        System.out.println(num);
    }
}

Или вы можете удалить список номеров, если ваш номер продукта всегда 0,1,2,3 ...

...