添加

时间:2016-11-12 12:05:08

标签: java android list arraylist random

我的代码中有20个名字。 我的函数有2个选项可以将元素添加到列表中:

1

将所有20个名字插入列表:

public void addNames() {
    list.add("name1");
    list.add("name2");
    ...
    list.add("name20");
}

2

仅将5个随机名称(来自20个名称)添加到列表中。为了做到这一点,我想到了两种方式。从20中随机抽取5个名字的最佳方法是什么?也许你有更好的方法。

:一种。

使用一组随机索引(每个值将介于0到19之间,因为有20个名称),在“添加”之前,我会检查是否通过某个计数器添加它们:

public void addNames() {
    // adding 5 random indices between 0 to 19 to the set
    Set<Integer> set = new HashSet<Integer>();
    Random r = new Random();
    Set<Integer> indices = new HashSet<>(numRandomNames); //==5
    for (int i = 0; i < numRandomNames; ++i) {
        int index = r.nextInt(numNames - 0); //==19
        indices.add(index);
    }

    int counter = 0;
    if (indices.contains(counter)) {
        list.add("name1");
    }
    counter++;
    if (indices.contains(counter)) {
        list.add("name2");
    }
    counter++;
    if (indices.contains(counter)) {
        list.add("name3");
    }
    ...
}

RandomList扩展List并覆盖'add'函数以执行与' A。'相同的操作但是覆盖'add'将决定是否在函数内添加值以便我的函数将使用覆盖'添加'功能

1。相同

您是否考虑过更好的解决方案?如果没有,那么哪一个更好? (A或B?)。我刚看到人们建议不要扩展java集合,但我认为这是这两种解决方案的最佳解决方案。

注意

====

我的代码可以有10000个或更多名称,所以我不想将所有10,000个名称添加到此\ other列表中,然后随机将其中的5个添加到其他列表中。我更喜欢在添加过程中这样做,以避免列表中的许多地方,而我真的不需要它们。

修改

对ProgrammerTrond的回答:

我不确定我会这样做,但我要求我展示的是我对2.B的建议:

public class RandomList<Integer> implements List<Integer> {
    private int addCallsCounter;
    private Set<Integer> setIndices = null;

    public RandomList(final int numElements, final int maxVal, final int minVal) {
        addCallsCounter = 0;
        setIndices =  new HashSet<Integer>(numElements);
        Random r = new Random();
        while (setIndices.size() < numElements) {
            int index = r.nextInt(maxVal - minVal + 1) + minVal;
            if (setIndices.contains(index) == false) {
                setIndices.add(index);
            }
        }
    }

    @Override
    public boolean add(Integer object) {
        if (setIndices.contains(addCallsCounter++)) {
            this.add(object);
            return true;
        }
        return false;
    }
}

从我的代码中我会这样做:

RandomList randList = new RandomList(5);
randList.add("name1");
randList.add("name2");
randList.add("name3");
...
randList.add("name19");
randList.add("name20");

但我的问题是我需要实现List pfff的许多抽象方法。 RandomList也不能是抽象的,因为它无法实例化。

2 个答案:

答案 0 :(得分:1)

试试这个:

List<Integer> index = new ArrayList<>();
List<String> five_names = new ArrsyList<>();
List<String> allnames = new ArrayList<>();

存储五个随机值

for(int i = 0;i < 5;i++){

  int index_no = getrandomNumber();
  index.add(index_no);
  five_names.add(allnames.get(index_no));
}

getRandomNumber方法:

public int getRandomNumber(){

    Random rnd = new Random();
    int x = rnd.nextInt(20);

    if(index.contains(x)){
       return getRandomNumber();
    }else{
       return x
    }
 }

答案 1 :(得分:0)

为什么不喜欢这样?您不需要列表实现中的随机索引列表。难道你不只是想要一个方法来添加从一组可用名称中抽取的5个随机名称吗?

b