我想要改变一个Arraylist并且再也不会带来相同的结果。
如何使用Collections.shuffle(myList);
?
如果这是答案在其他地方发布,请知道。
修改
以下是我显示结果的方式
textView.setText(myList.get(0));
答案 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;
答案 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++));
修复了它!