生成0到3之间的随机数并添加到android中的arraylist

时间:2014-06-04 08:54:52

标签: java android eclipse

我正在尝试制作一个测验应用程序,其中的选项显示在按钮中。但我想在按钮上随机显示选项。所以我使用随机类随机生成0到3之间的数字然后添加它是一个arraylist。从数据库中检索到四个选项到一个数组。数组的索引将是arraylist的元素。

代码如下:

public void setoptions(String player_name)
    {
        //int arr[]=new int[4];
        int ran;
        Random r=new Random();
         ran=r.nextInt(3 - 0 + 1) + 0;


        ArrayList<Integer> c=new ArrayList<Integer>();
//       c.add(ran);
        //Toast.makeText(getApplicationContext(), ran+"",Toast.LENGTH_LONG).show();

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

            ran=r.nextInt(3 - 0 + 1) + 0;

            if(c.contains(ran))
            {
                i=0;
                continue;
            }
            else
             {
                c.add(ran);
             }

        }
        c.add(ran);



        optarr=dbm.getoptions(player_name);
        Toast.makeText(getApplicationContext(),player_name,Toast.LENGTH_LONG).show();

            btnopt1.setText(optarr[c.get(0).intValue()]);
            btnopt2.setText(optarr[c.get(1).intValue()]);
            btnopt3.setText(optarr[c.get(2).intValue()]);
            btnopt4.setText(optarr[c.get(3).intValue()]);
//          i=(int) Math.random();
        //}     
    }

我收到以下logcat:

06-04 04:45:03.697: E/AndroidRuntime(30164): FATAL EXCEPTION: main
06-04 04:45:03.697: E/AndroidRuntime(30164): Process: com.example.readfifa, PID: 30164
06-04 04:45:03.697: E/AndroidRuntime(30164): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
06-04 04:45:03.697: E/AndroidRuntime(30164):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at java.util.ArrayList.get(ArrayList.java:308)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at com.example.readfifa.MainActivity.setoptions(MainActivity.java:226)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at com.example.readfifa.MainActivity$1.onItemSelected(MainActivity.java:62)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at android.widget.AdapterView.fireOnSelected(AdapterView.java:893)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at android.widget.AdapterView.access$200(AdapterView.java:48)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:861)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at android.os.Handler.handleCallback(Handler.java:733)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at android.os.Handler.dispatchMessage(Handler.java:95)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at android.os.Looper.loop(Looper.java:137)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at android.app.ActivityThread.main(ActivityThread.java:4998)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at java.lang.reflect.Method.invokeNative(Native Method)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at java.lang.reflect.Method.invoke(Method.java:515)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
06-04 04:45:03.697: E/AndroidRuntime(30164):    at dalvik.system.NativeStart.main(Native Method)

问题似乎是arraylist只获得一个值。那么如何在arraylist的四个位置获得0到3之间的四个随机数。请帮助!!

9 个答案:

答案 0 :(得分:1)

如果要在列表中添加4个元素,则需要将for循环条件更改为此类

for(int i=0; i<4; i++)

目前,当您提供c.size()时,如果未添加任何元素或仅添加了1个元素,则循环将停止该时间,并且您的列表不包含/单个元素,这将在您提供时为IndexOutOfBoundsException尝试访问列表中的第2,第3或第4个元素。

答案 1 :(得分:1)

您可以使用静态数组,然后创建一个随机函数来抽取数组的位置。

例如:

你的arraylist就像这样{0,1,2,3},然后你得到一个得到(x);其中x = 0到3之间的随机值。

此致

答案 2 :(得分:1)

你的错误是你使用c.size()作为限制循环大小的变量,而c.size()在循环内部被修改。 使用声明ArrayList<Integer> c=new ArrayList<Integer>();时,ArrayList c创建时没有元素。所以c.size() = 0此时此刻。当您使用c方法向c.add()方法添加元素时,其大小会增加 您应该使用c.size替换循环中的4,或将c声明为ArrayList<Integer> c=new ArrayList<Integer>(4);

答案 3 :(得分:0)

如果您只想创建一个包含数字{0,1,2,3}的随机顺序的4元素列表,您可以创建一个4长度数组,然后通过指定第i个随机交换它们根据rand.nextInt(4)进行索引和随机化。

答案 4 :(得分:0)

ArrayList c = new ArrayList();
- &GT; c.size()= 0;
- &GT; btnopt1.setText(optarr [c.get(0).intValue()]);
- &GT;错误

你需要初始大小为c的那样的 ArrayList c = new ArrayList(YOUR_SIZE);

答案 5 :(得分:0)

 ArrayList<Integer> c=new ArrayList<Integer>();

然后拨打for(int i=0;i<c.size();i++)

  

数组的索引将是arraylist的元素。   因此,在您的函数中,您应该添加一个参数来解析它并使用list.get()

来检索它

答案 6 :(得分:0)

这一行的问题:

     i<c.size()

你没有决定数组列表的大小。意味着ArrayList最初在其中包含零元素。

因此你需要在ArrayList中添加一些元素然后迭代它。

for(int counter=0; counter<someSize; counter++){

      // Add element logic here
   }

答案 7 :(得分:0)

就像已经说过的那样,你必须在for循环中迭代4次,而不是空ArrayList()的大小。在这里,我为您编写了代码simillar:

import java.util.*;

public class Rand {

    public static void main(String[] args)
    {
        Random generator = new Random();
        ArrayList<Integer> arr = new ArrayList<Integer>();
        for(int i=0; i<4; i++)
        {
            int r = generator.nextInt(4);
            if(!arr.contains(r))
            {
                arr.add(r);
            }
            else
            {
                i--;
            }
        }

        System.out.println(arr);
    }

}

答案 8 :(得分:0)

你可以这样做。虽然这可能不是最有效的算法,但很容易理解。

public void setoptions(String player_name)
{
    ArrayList<Integer> c=new ArrayList<Integer>();

    Random random=new Random();
    while(c.size() < 4)
    {
        int randomIndex = random.nextInt(4);
        if(false == c.contains(randomIndex))
        {
            c.add(randomIndex);
        }
    }

    optarr=dbm.getoptions(player_name);
    Toast.makeText(getApplicationContext(),player_name,Toast.LENGTH_LONG).show();

    btnopt1.setText(optarr[c.get(0).intValue()]);
    btnopt2.setText(optarr[c.get(1).intValue()]);
    btnopt3.setText(optarr[c.get(2).intValue()]);
    btnopt4.setText(optarr[c.get(3).intValue()]);
}

编辑:这个效率更高(循环总是只有4次迭代)

public void setoptions(String player_name)
{
    ArrayList<Integer> options = new ArrayList<Integer>(Arrays.asList(new Integer[]{0,1,2,3}));
    ArrayList<Integer> c = new ArrayList<Integer>();

    Random random=new Random();
    while(options.size() > 0)
    {
        int randomIndex = random.nextInt(options.size());
        c.add(options.remove(randomIndex));
    }

    optarr=dbm.getoptions(player_name);
    Toast.makeText(getApplicationContext(),player_name,Toast.LENGTH_LONG).show();

    btnopt1.setText(optarr[c.get(0).intValue()]);
    btnopt2.setText(optarr[c.get(1).intValue()]);
    btnopt3.setText(optarr[c.get(2).intValue()]);
    btnopt4.setText(optarr[c.get(3).intValue()]);
}