前两天到一家公司面试,面试官最后让我写这么一个方法,返回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());
}