编写一个方法,返回100个互不重复,且顺序被打乱的集合

本文介绍如何生成一个包含100个互不重复且顺序随机的整数集合,提供了三种实现方式:使用List的set方法替换值、使用Collections.swap方法交换元素位置、使用Collections.shuffle直接打乱集合顺序。

前两天到一家公司面试,面试官最后让我写这么一个方法,返回100个互不重复,且顺序被打乱的集合。当时有点懵,一直想着集合中有Set是存放不重复的值,最后还是实现错了。这里写一下正确的实现方法。有三种方法:

一、使用list.set(int index, E element)方法,进行值的替换,其中index用100以内的随机数

二、使用Collections中的一个方法,swap(List<?> list, int i, int j),它的底层实现跟方法一一样,具体方法如下

public static void swap(List<?> list, int i, int j) {
final List l = list;
l.set(i, l.set(j, l.get(i)));//l.set(int index, E element)会返回index的那个元素。
    }

三、使用Collections封装好的方法,shuffle(List<?> list)。

public static void shuffle(List<?> list) {
        if (r == null) {
            r = new Random();
        }
        shuffle(list, r);
    }


具体代码可以参考如下:


        @Test
public void getList1(){
Random random = new Random();
int arrLength = 10;
List<Integer> result = new ArrayList<Integer>(arrLength);
for(int i = 1;i <= arrLength;i++){
result.add(i);
}
System.out.println("打乱前:" + result.toString());
for(int i = 0;i < arrLength;i++){
int randomPosition = random.nextInt(arrLength);
int temp =  result.get(i);
result.set(i, result.get(randomPosition));
result.set(randomPosition, temp);
}
System.out.println("打乱后:" + result.toString());
}
@Test
public void getAList2(){
Random random = new Random();
int arrLength = 10;
List<Integer> result = new ArrayList<Integer>(arrLength);
for(int i = 1;i <= arrLength;i++){
result.add(i);
}
System.out.println("打乱前:" + result.toString());
for(int i = 0;i < arrLength;i++){
Collections.swap(result, i, random.nextInt(arrLength));
}
System.out.println("打乱后:" + result.toString());
}
@Test
public void getList3(){
int arrLength = 10;
List<Integer> result = new ArrayList<Integer>();
for(int i = 1;i <= arrLength;i++){
result.add(i);
}
System.out.println("打乱前:" + result.toString());
Collections.shuffle(result);
System.out.println("打乱后:" + result.toString());
}


顺便提一下关于Random的使用。

@Test
public void radomTest(){
Random random = new Random(10);//10是随机种子,如果这样设置了随机种子,那在同一台机器,每次执行得到的结果都是一样的
List<Integer> result = new ArrayList<Integer>();
for(int i=0;i<10;i++){
result.add(random.nextInt(5));//5是随机数的范围
}
System.out.println("结果:" + result.toString());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值