从ArrayList检索样本

时间:2017-07-22 18:20:16

标签: java android arrays arraylist

我有一个包含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;
}

5 个答案:

答案 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
}