如何获得无重复的随机字符串值?

时间:2017-01-17 12:42:33

标签: java arrays random

我想只获取一个公司名称,我只想获取一次。因此,如果它已被提取,则不应再次获取它。

以下是代码:

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

2 个答案:

答案 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