java如何打乱arraylist中的对象,一定不能重复啊!
发布网友
发布时间:2022-05-16 01:50
我来回答
共5个回答
热心网友
时间:2023-05-11 00:15
如果你不相重复,那用HashSet保证集合的元素不重复.
然后将为SET变为ArrayList
HashSet<String> set = new HashSet<String>();
set.add("1");
set.add("1");
ArrayList<String> list = new ArrayList<String>();
list.addAll(set);
如上.
你上面的代码,出现重复的原因是,你删除了一个元素,那么索引的值就变了,想插入回源来的位置,那就要减1.追问减1之后出现这个问题了
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: -1, Size: 39
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:612)
at java.util.ArrayList.add(ArrayList.java:426)
at Pack.main(Pack.java:30)
我代码里的NUM_CARDS = 40
追答你不减也会出问题,
Briscola temp = pack.get(i);
pack.remove (i);
pack.add (i,pack.get(j));
就拿来这两句来说吧,
假设你J随机的是39,你移除了一个, 这样一GET也是这个问题,
我把这个数设成10,这样的问题常发生.
如果你想要乱序,我给你一个算法.如下.
--------------------------------------------------------------------------
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
List pack = new ArrayList();
List result = new ArrayList();
int NUM_CARDS = 10;
for (int i = 0; i 0) {
int random = (int) (Math.random() * NUM_CARDS * 100);
random = random % pack.size();
result.add(pack.remove(random));
}
System.out.println(result);
}
}
热心网友
时间:2023-05-11 00:16
就像1楼说的.用set是最简单的方法
如果只能用ArrayList的话的就加个判断如果有重复元素的话就不加进去就行了
我把整个类从写了下.......
import java.util.ArrayList;
class NewClass
{
public static void main(String[] args)
{
int NUM_CARDS=5;
ArrayList<Integer> pack=new ArrayList<Integer>();
for ( int i = 0; i < NUM_CARDS; i++ )
{
int j = ( int ) ( Math.random() * NUM_CARDS );
if(a(pack,j))
{
pack.add(j);
}
}
for(int i1:pack)
{
System.out.print(i1);
}
}
static boolean a(ArrayList<Integer> al,int i)
{
for(int j:al)
{
if(j==i)
{
return false;
}
}
return true;
}
}
热心网友
时间:2023-05-11 00:16
这是我做的项目中用到的一点打乱题目顺序代码
int pages[] =new int[6]; //存题号
ArrayList<Integer> list=new ArrayList<Integer>();
for (int i = 0; i < pages.length; i++) {
list.add(i+1); //题号1,2,3...
}
Random r=new Random();
int i=0;
while (i < pages.length) {
int index=r.nextInt(list.size()); //随机生成一个 list 的index
pages[i]=list.get(index);//将其根据循环依次加入pages
list.remove(index);//移除这个项,下一次就不会再取到这个了
i++;
}
pages 就是打乱顺序后的题号
热心网友
时间:2023-05-11 00:17
就像楼上说的,加入i==j==NUM_CARDS-1,你这么做就会有问题。
建议你原数据还是不要动,再维护个list放数据,维护个map排重。乱写一个,没跑过,凑合看吧。
List<Briscola> otherList = new ArrayList<Briscola>();
Map<Integer,Integer> repeatMap = new HashMap<Integer,Integer>();
Random rand = new Random(new Date().getTime());//用系统时间作为随机的种子,每次都不一样
for ( int i = 0; i < NUM_CARDS; i++ )
{
int j = rand.nextInt(NUM_CARDS);
while(null != repeatMap.get(j)){
j = rand.nextInt(NUM_CARDS);
}
repeatMap.put(j,j);
otherList.add(pack.get(j));
}
热心网友
时间:2023-05-11 00:17
只要随即一个数,然后挑取出来插在最后,就不会有Bound的问题咯.