如果更改大小,如何从ArrayList中选择随机元素?

时间:2018-12-10 15:35:31

标签: java arrays arraylist random collections

在我的代码“ count0”中,“ count1”和“ count2”接收随机值,“ totalCount”是它们的总和。在这里,我已经简化了。

使用此代码,我可以选择ArrayList的随机元素,但是例如,如果“ count0”等于0,则它将不仅从第一次而且每次迭代都从ArrayList中删除索引0,如果发生这种情况,则会导致错误。 想法是如何从食品储藏室中随机选择食材,当一种食品用尽时,您仍然可以从其余的储藏室中进行选择。

感谢帮助=)

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 :(得分:0)

使用两个列表计数(您拥有多少个产品)和数字(产品编号):

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 ...

答案 1 :(得分:0)

谢谢,伙计们。你们真棒。 我会尝试您的所有建议,但我想出了一个可行的解决方案。我没有从列表中删除项目,而是给了它们一个值,我可以通过do-while来控制它们,以便您仅选择可用的项目。

我的代码是对吸烟问题(线程和同步)的修改。在我的代码中,每个吸烟者都有一定数量的雪茄,可以在剩下的雪茄之前吃完,因此代理人不必为他装食材。

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