/**
* 使用一个List来保存数组,每次随机取出一个移除一个。
*/
public String[] getRandomArray(int n, String[] strArray){
List<String> list = new ArrayList<String>();
for(int i=0; i<strArray.length; i++){
list.add(strArray[i]);
}
Random random = new Random();
// 当取出的元素个数大于数组的长度时,返回null
if(n>list.size()){
return null;
}
String[] result = new String[n];
for(int i=0; i<n; i++){
// 去一个随机数,随机范围是list的长度
int index = random.nextInt(list.size());
result[i] = list.get(index);
list.remove(index);
}
return result;
}
思路2:在使用一个boolean型数组保存对应数组中元素是否被取出的状态。
/**
* 使用一个两个数组,一个来保存元素,一个用来保存对应元素是否被取走
*/
public String[] getRandomArray(int n, String[] strArray){
// 当取出的元素个数大于数组的长度时,返回null
if(n>strArray.length){
return null;
}
// 定义一个域strArray相同长度的数组,每个位置保存对应位置是否被取走
boolean[] bool = new boolean[strArray.length];
for(int i=0; i<strArray.length; i++){
bool[i] = false;
}
Random random = new Random();
String[] result = new String[n];
for(int i=0; i<n; i++){
int index;
// 判断随机的位置是否被取走,取走则继续循环
do{
index = random.nextInt(n);
}while(bool[index]);
// 取出元素,将其对应位置设置为true
bool[index] = true;
result[i] = strArray[index];
}
return result;
}