2013-01-17 23 views
1

我有一个对象的ArrayList从我想要的项目的特定位置,但每次我启动活动时检索的位置应该是随机的,也不会重复,直到每个位置项目被完全检索。我用这个方法:如何从一个arraylist没有任何重复的随机项目android

public static int getRandomNumber(ArrayList<Integer> arr) 
      throws IllegalArgumentException { 
     try { 
      Random random = new Random(); 
      int select = random.nextInt(arr.size()); 
      int randomnum = arr.get(select); 
      GlobalData.randList.remove(select); 
      return randomnum; 
     } catch (IllegalArgumentException e) { 

      for (int i = 0; i < arr.size(); i++) { 

       GlobalData.randList.add(i); 

      } 
      return 0; 
     } 

,但其没有工作,喜欢重复号的到来,有可能是因为每次我重新启动活动的原因。我在oncreate而不是onResume,但它没有按我的预期工作?有没有其他的方式来使用它?任何解决方案

+7

使用Collections.shuffle –

+0

我可以解释一下吗?它会在每个位置完成之前不会重复吗? – Reyjohn

+0

评论很简短,因为我在过去的几个星期里多次提供了这个答案。 ;) –

回答

2

使用Collections.shuffle()来洗牌阵列。使用另一个变量来跟踪数组中的当前位置。每次您检索一个新值都会增加该变量。一旦你到达阵列的末尾,重新洗牌。

参考: Shuffling algorithms

public class RandomArray { 
    ArrayList<Integer> array = null; 
    int position = 0; 

    public RandomArray(ArrayList<Integer> arr) { 
     array = arr; 
     position = arr.size(); 
    } 

    public int getNext() { 
     if (position == array.size()) { 
      position = 0; 
      Collections.shuffle(array); 
     } 
     return array.get(position++); 
    } 
} 
+0

我用你的系统,但它重复:( – Reyjohn

+0

是的,它在数组中的每个元素已经显示一次后重复,它也将重复,如果你有一个对象中的重复。 – Frohnzie

1

如果你不关心原来的顺序,你可以试试这个:

Object[] array = new Object[10]; // say 10 objects 
int remain = array.length; 
Random rnd = new Random(); 

public Object next() { 
    if (remain == 0) { 
     return null; 
    } else { 
     int i = rnd.nextInt(remain--); 
     Object tmp = array[i]; 
     array[i] = array[remain]; 
     array[remain] = tmp; 
     return tmp; 
    } 
} 

你也可以做类似的事情,与ArrayList的。

那么,这样,它比shuffle()方法快。 shuffle()具有O(n)的时间复杂度,而我的代码是O(1)。

+0

我得到一个对象后,我改变活动,如果我再次返回该活动,该如何继续? – Reyjohn

+0

您可以将随机化代码写入单独的类中,并使该方法为静态。 – shuangwhywhy

相关问题