如何在不显示重复的情况下随机播放(Arraylist)

时间:2014-07-09 16:27:13

标签: java android

我想要改变一个Arraylist并且再也不会带来相同的结果。

如何使用Collections.shuffle(myList);

执行此操作

如果这是答案在其他地方发布,请知道。

修改

以下是我显示结果的方式 textView.setText(myList.get(0));

5 个答案:

答案 0 :(得分:2)

Collections.shuffle未提供该功能。您需要执行单独的重复数据删除步骤。 Set将提供该功能。

Set s = new HashSet(myList.size());
s.addAll(myList);
List shuffledList = new ArrayList(s.size());
shuffledList.addAll(s)
// Since items come out of a set in an undefined order, using shuffledList
// in this state may suit your needs. otherwise go ahead and shuffle it too
Collections.shuffle(shuffledList)
return shuffledList;

这是a more advanced question on deduplication

答案 1 :(得分:0)

Collections.shuffle只会随机播放列表。它没有保持任何以前的状态。因此,如果您想避免重复,您必须保持先前生成的列表的状态并进行比较。或者,您可以找到所有可能的组合以及逐个列出的访问权限。 Google Guava库具有查找组合的方法。 Collections2.permutations(myList)例如

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.google.common.collect.Collections2;

public class Shuffle {

    public static void main(String args[]) {
        List<String> myList = new ArrayList<String>(Arrays.asList(new String[] {"a", "b", "c"}));
        for(List<String> list : Collections2.permutations(myList)){
            System.out.println(list);
        }
    }

}

这将提供所有非重复的随机播放。

答案 2 :(得分:0)

如果我理解正确你只想显示一个列表的随机值,在这种情况下使用它(不需要随机播放整个列表):

int rand = (int)(array.size()*Math.random());
textView.setText(myList.get(rand));

编辑:

将此函数与全局tmp变量一起使用:

private List<String> tmpList = new ArrayList<String>();
private String getRandom(List<String> myList){
    if (tmpList.size()<=0) tmpList = new ArrayList<String>(myList);
    int rand = (int)(tmpList.size()*Math.random());
    return tmpList.remove(rand);
}

并将值设置为:

textView.setText(getRandom(myList));

答案 3 :(得分:0)

您可以创建一个存储以前使用过的项目的附加列表。每次获得一个项目,您都可以检查它是否已被使用(如果是,请跳过它)。这样,您可以保留原始项目的使用机会。如果你有10个A和一个B,并且你将它们洗牌,那么你有更高的机会让A先出现......等等。如果你不想要这个功能,那么我建议使用一套。

ArrayList<String> used = new ArrayList<String>();
ArrayList<String> items = getItems();
Collections.shuffle(items);

public String getItem() {
  if(items.length == 0)
    return null;
  item = items.remove(0);
  if(used.contains(item)) 
    return getItem();
  return used.add(item)
}

在使用集合

的情况下
HashSet<String> items = new HashSet<String>(getItems());
Collections.shuffle(items);

public String getItem() {
  return items.remove(0);
}

答案 4 :(得分:0)

感谢您提出的所有想法和建议!

我的问题很愚蠢。

textView.setText(myList.get(order++));修复了它!