首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请教怎么随机取list里的某几个值,但值是不能相同的

2012-01-16 
请问如何随机取list里的某几个值,但值是不能相同的?请问如何随机取list里的某几个值,但值是不能相同的?假

请问如何随机取list里的某几个值,但值是不能相同的?
请问如何随机取list里的某几个值,但值是不能相同的?假若list里有8个数字,我要随机取5个,但不能有重复的。

[解决办法]
比较一下 重复的话就不拿 继续下一次

再说你List里有8个数 你要拿5个出来 还不能重复

你那8个数如果是 1 1 1 1 1 1 1 1 的话怎么办
[解决办法]
最直接的方法是:
新建一个list,将原有list全部复制。
在新list中随机取出数,取出之后立刻list.remove()
然后呢,就能够保证每次取出来肯定不一样了。
[解决办法]
随机排一下序再取。
[解决办法]
可以考虑下先shuffer(Collenctions的一个方法,好像是),然后取前五个

[解决办法]

Java code
import java.util.Arrays;import java.util.Random;/** * <code>RandomUtil</code> - Random Tool Class. * @author SageZk * @version 1.0 */public class RandomUtil {    private RandomUtil() {}    private static Random rnd = null;    /**     * 初始化随机数发生器。     */    private static void initRnd() {        if (rnd == null) rnd = new Random();    }    /**     * 计算并返回无重复值的以 <code>min</code> 为下限 <code>max</code> 为上限的随机整数数组。     * @param min 随机整数下限(包含)     * @param max 随机整数上限(包含)     * @param len 结果数组长度     * @return 结果数组     */    public static int[] getLotteryArray(int min, int max, int len) {        //参数校验及性能优化        if (len < 0) return null;  //长度小于 0 的数组不存在        if (len == 0) return new int[0];  //返回长度为 0 的数组        if (min > max) {  //校正参数 min max            int t = min;            min = max;            max = t;        }        final int LEN = max - min + 1;  //种子个数        if (len > LEN) return null;  //如果出现 35 选 36 的情况就返回 null        //计算无重复值随机数组        initRnd();  //初始化随机数发生器        int[] seed = new int[LEN];  //种子数组        for (int i = 0, n = min; i < LEN;) seed[i++] = n++;  //初始化种子数组        for (int i = 0, j = 0, t = 0; i < len; ++i) {            j = rnd.nextInt(LEN - i) + i;            t = seed[i];            seed[i] = seed[j];            seed[j] = t;        }        return Arrays.copyOf(seed, len);  //注意:copyOf 需要 JRE1.6    }    //Unit Testing    public static void main(String[] args) {        final int N = 10000;  //测试次数        for (int i = 0; i < N; ++i) {            int[] la = RandomUtil.getLotteryArray(1, 35, 7);            if (la == null) continue;            for (int v : la) System.out.printf("%0$02d ", v);            System.out.println();        }    }}
[解决办法]
Java code
        List<Integer> list = new ArrayList<Integer>();        Set<Integer> set = new HashSet<Integer>();        Random rand = new Random();        list.add(8);        list.add(9);        list.add(5);        list.add(4);        list.add(5);        list.add(9);        list.add(0);        list.add(3);        while(set.size() < 5)        {            set.add(list.get(rand.nextInt(list.size())));        }        for(Integer num: set)        {            System.out.println(num);        }
[解决办法]
当你生成随机数到ArrayList的时候换成HashSet
HashSet的特性就是值唯一。这样取出的时候就不用判断了。
[解决办法]
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
//...
int[] idx = RandomUtil.getLotteryArray(0, list.size() - 1, 6 /*取几个*/);
Integer is = new Integer[idx.length];
int j = 0;
for (i : idx) {
is[j++] = list.get(i);
}

热点排行