Java Android:将字符串与哈希集中的颜色匹配-在屏幕上随机显示?

Java Android:将字符串与哈希集中的颜色匹配-在屏幕上随机显示?,java,android,arrays,hashset,Java,Android,Arrays,Hashset,我正在尝试创建一个android游戏,类似于 在我的第一步中,我尝试创建一个HashMap,其中颜色字符串作为键,相应的android颜色作为值。即: HashMap<String, Integer> colors= new HashMap<>(); colors.put("Green", Color.GREEN); colors.put("Blue", Color.BLUE); colors.put("Red", Col

我正在尝试创建一个android游戏,类似于

在我的第一步中,我尝试创建一个HashMap,其中颜色字符串作为键,相应的android颜色作为值。即:

HashMap<String, Integer> colors= new HashMap<>();

        colors.put("Green", Color.GREEN);
        colors.put("Blue", Color.BLUE);
        colors.put("Red", Color.RED);
        colors.put("Yellow", Color.YELLOW);
        colors.put("Black", Color.BLACK);
当前活动代码:

public class Stroop extends ActionBarActivity {

    HashMap<String, Integer> colors= new HashMap<>();
    //putting the strings of the hasmap to an array
    Object stringOnScreen[]= colors.keySet().toArray();

    Object colorsOnScreen[]= colors.values().toArray();


    TextView color;
    Button btn1;
    Button btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stroop);

        Log.d("test", "test: " + stringOnScreen[2].toString()); //trace code


    }//oncreate end


    public void setUpQuestion(){

        //set the text of the string in textview for user to see
        color.setText("" + stringOnScreen[randInt(0, 4)]);

        color.setTextColor((int) colorsOnScreen[randInt(0,4)]);




    }





    public void setUpGame(){

        // setting up the hashmap
        colors.put("Green", Color.GREEN);
        colors.put("Blue", Color.BLUE);
        colors.put("Red", Color.RED);
        colors.put("Yellow", Color.YELLOW);
        colors.put("Black", Color.BLACK);

        // setting up vars
        color = (TextView) findViewById(R.id.tvStroopColor);
        btn1 = (Button) findViewById(R.id.btnStroop1);
        btn2 = (Button) findViewById(R.id.btnStroop2);

    }

    /**
     * method to get a random int
     * @param min
     * @param max
     * @return
     */
    public static int randInt(int min, int max) {

        // NOTE: Usually this should be a field rather than a method
        // variable so that it is not re-seeded every call.
        Random rand = new Random();

        // nextInt is normally exclusive of the top value,
        // so add 1 to make it inclusive
        int randomNum = rand.nextInt((max - min) + 1) + min;

        return randomNum;
    }


}
如何实现此功能?任何帮助都会很好

尝试的解决方案:

public class Stroop extends ActionBarActivity {

    HashMap<String, Integer> colors= new HashMap<>();
    //putting the strings of the hahsmap to an array
    Object stringOnScreen[]= colors.keySet().toArray();

    Object colorsOnScreen[]= colors.values().toArray();


    TextView color;
    Button btn1;
    Button btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stroop);

        setUpGame();

        setUpQuestion();



    }//oncreate end


    public void setUpQuestion(){

        int randString= new Random().nextInt(stringOnScreen.length);
        int randColor= new Random().nextInt(colorsOnScreen.length);


        //set the text of the string in textview for user to see
        color.setText("" + stringOnScreen[randString]);

        color.setTextColor(randColor);



    }


    public void setUpGame(){

        // setting up the hashmap
        colors.put("Green", Color.GREEN);
        colors.put("Blue", Color.BLUE);
        colors.put("Red", Color.RED);
        colors.put("Yellow", Color.YELLOW);
        colors.put("Black", Color.BLACK);

        // setting up vars
        color = (TextView) findViewById(R.id.tvStroopColor);
        btn1 = (Button) findViewById(R.id.btnStroop1);
        btn2 = (Button) findViewById(R.id.btnStroop2);

    }




}
现在获取以下Logcat错误报告:

07-27 23:11:22.482: E/AndroidRuntime(11902): FATAL EXCEPTION: main
07-27 23:11:22.482: E/AndroidRuntime(11902): Process: com.example.brianapp, PID: 11902
07-27 23:11:22.482: E/AndroidRuntime(11902): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.brianapp/com.example.brianapp.Stroop}: java.lang.IllegalArgumentException: n <= 0: 0
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.ActivityThread.access$900(ActivityThread.java:161)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.os.Handler.dispatchMessage(Handler.java:102)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.os.Looper.loop(Looper.java:157)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.ActivityThread.main(ActivityThread.java:5356)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at java.lang.reflect.Method.invokeNative(Native Method)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at java.lang.reflect.Method.invoke(Method.java:515)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at dalvik.system.NativeStart.main(Native Method)
07-27 23:11:22.482: E/AndroidRuntime(11902): Caused by: java.lang.IllegalArgumentException: n <= 0: 0
07-27 23:11:22.482: E/AndroidRuntime(11902):    at java.util.Random.nextInt(Random.java:175)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at com.example.brianapp.Stroop.setUpQuestion(Stroop.java:51)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at com.example.brianapp.Stroop.onCreate(Stroop.java:42)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.Activity.performCreate(Activity.java:5426)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
07-27 23:11:22.482: E/AndroidRuntime(11902):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
07-27 23:11:22.482: E/AndroidRuntime(11902):    ... 11 more
注行:

 07-27 23:11:22.482: E/AndroidRuntime(11902): Caused by: java.lang.IllegalArgumentException: n <= 0: 0
    07-27 23:11:22.482: E/AndroidRuntime(11902):    at java.util.Random.nextInt(Random.java:175)
    07-27 23:11:22.482: E/AndroidRuntime(11902):    at com.example.brianapp.Stroop.setUpQuestion(Stroop.java:51)
    07-27 23:11:22.482: E/AndroidRuntime(11902):    at 

正如日志所述,数组索引超出了范围,因为数组是空的。在调用setUpGame后初始化stringOnScreen和colorOnScreen,并在访问阵列之前执行这两项操作

public class Stroop extends ActionBarActivity {

    HashMap<String, Integer> colors = new HashMap<>();

    Object stringOnScreen[];
    Object colorsOnScreen[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stroop);

        setUpGame()

        stringOnScreen = colors.keySet().toArray();
        colorOnScreen = colors.values().toArray();

        Log.d("test", "test: " + stringOnScreen[2].toString());

    }

    ...
}

考虑到你的解决方案,我试图解决这个问题。请查看我最近的编辑,因为我现在遇到了一个不同的问题。您仍然在构造时初始化您的字段,所以它们仍然是空的。再看看我的解决方案。调用setUpGame后,需要初始化stringOnScreen和colorOnScreen。
public class Stroop extends ActionBarActivity {

    HashMap<String, Integer> colors = new HashMap<>();

    Object stringOnScreen[];
    Object colorsOnScreen[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stroop);

        setUpGame()

        stringOnScreen = colors.keySet().toArray();
        colorOnScreen = colors.values().toArray();

        Log.d("test", "test: " + stringOnScreen[2].toString());

    }

    ...
}