我有一个包含100个字母的ArrayList,我需要随机检索其中的40个字母。
这可能吗?
目前,我每次都收到100封信:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
List<Integer> lettersArray = new ArrayList<>(Arrays.asList(letters));
Collections.shuffle(lettersArray);
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(lettersArray.get(position));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setAdjustViewBounds(true);
return imageView;
}
我尝试了这个但没有改变:
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
List<Integer> lettersArray = new ArrayList<>(Arrays.asList(letters));
for (int i = 0; i < lettersArray.size(); i++) {
Collections.shuffle(lettersArray);
lettersArray.get(40);
imageView.setImageResource(lettersArray.get(position));
}
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setAdjustViewBounds(true);
return imageView;
}
答案 0 :(得分:4)
简单:如果你想要40个随机条目 - 随机播放你的数组(一次就够了)然后从0到39循环并选择相应的数组插槽。
这就是全部。
答案 1 :(得分:2)
目前,我每次都收到100封信:
那是因为你的适配器getItemCount()
正在返回lettersArray.length
,显然是100。
在调用getView
之前,您需要将数组的混洗子集提供给适配器。
List<Integer> allLetters = new ArrayList<Integer>();
// add some data
Collections.shuffle(allLetters);
List<Integer> someLetters = allLetters.subList(0, 40);
// Remove duplicates if you want
adapter = new YourAdapter(context, someLetters);
然后你不关心你的getView方法中的arraylist ......
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setAdjustViewBounds(true);
imageView.setImageResource(getItem(position));
return imageView;
}
答案 2 :(得分:1)
您可以生成40
个随机数并将结果存储在Set
中以防止重复,例如:
List<Integer> letters = new ArrayList<>();
Set<Integer> elements = new HashSet<>();
Random random = new Random();
do{
Integer randomIndex = random.nextInt(letters.size());
elements.add(letters.get(randomIndex));
}while(elements.size() < 40);
如果您希望列表作为结果,则可以将Set
转换为List
,例如:
List<Integer> uniqueList = new ArrayList<>(elements);
答案 3 :(得分:1)
@GhostChat答案是对的,但如果你不想要0-40直值,你可以使用这个
import java.util.Random;
Random rand = new Random();
for(int i =0 ; i<40;i++)
{
int n = rand.nextInt(40);
}
//this will generate 40 random values
答案 4 :(得分:0)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
List<Character> fullList = new ArrayList<>(Arrays.asList(letters));
Collections.shuffle(fullList);
List<Character> cuttedList = fullList.subList(0, min(fullList.size(), 40));
//... cuttedList contains 40 elements or less if fullList will contain less than 40 elements
}