我的代码中有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也不能是抽象的,因为它无法实例化。
答案 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