我正在尝试制作一个测验应用程序,其中的选项显示在按钮中。但我想在按钮上随机显示选项。所以我使用随机类随机生成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之间的四个随机数。请帮助!!
答案 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()]);
}