我想只获取一个公司名称,我只想获取一次。因此,如果它已被提取,则不应再次获取它。
以下是代码:
private static String[] billercompanies = {
"1st",
"TELUS Communications",
"Rogers Cablesystems",
"Shaw Cable",
"TELUS Mobility Inc",
"Nanaimo Regional District of",
"Credit Union MasterCard",
};
public static String GetBillerCompany(){
String randomBillerComp = "";
randomBillerComp = (billercompanies[new Random().nextInt(billercompanies.length)]);
return randomBillerComp;
}
答案 0 :(得分:1)
只需使用集合
对所需的数组进行随机播放Collections.shuffle(List);
所以只需从数组中创建一个列表
List<E> list = Arrays.asList(array);
然后使用上面的方法将其洗牌
Collections.shuffle(list);
您的列表可以从左到右阅读,因为它是随机的。 所以只需保存索引
int currentIndex = 0;
public E getRandom(){
//If at the end, start over
if(++currentIndex == list.size()) {
currentIndex = 0;
shuffle(list);
}
return list.get(currentIndex);
}
每次你想忘记你已经使用过的重复列表时,只需再次洗牌即可
Collections.shuffle(list);
每次只需删除第一个值,一旦列表为空,用原始数组重新创建它。作为Ole V.V.指针输出,由Arrays.asList(E[])
生成的列表不支持删除方法,因此有必要从中生成新实例。
以下是使用此解决方案的快速简单的课程:
public class RandomList<E>{
E[] array;
List<E> list;
public RandomList(E[] array){
this.array = array;
buildList(array);
}
public E getRandom(){
if(list.isEmpty()) buildList(array);
return list.remove(0);
}
public void buildList(E[] array){
list = new ArrayList<E>(Arrays.asList(array));
Collections.shuffle(list);
}
}
测试是用这个小代码完成的:
Integer[] array = {1,2,3,4,5};
RandomList<Integer> rl = new RandomList(array);
int i = 0;
while(i++ < 10)
System.out.println(rl.getRandom());
答案 1 :(得分:1)
在列表中制作副本,并在已经提取该元素时将其删除。
Arrays.asList(array)
不可修改,但您可以将其包装在功能齐全的列表中。
List<String> billercompaniesList = new ArrayList<>(Arrays.asList(billercompanies));
String randomBillerComp = "";
Random random = new Random();
// first retrieval
int index = random.nextInt(billercompaniesList.size());
randomBillerComp = billercompaniesList.get(index);
billercompaniesList.remove(index);
// second retrieval
index = random.nextInt(billercompaniesList.size());
randomBillerComp = billercompaniesList.get(index);
billercompaniesList.remove(index);
// and so for