Laurent Fournier
Laurent Fournier

Reputation: 25

Just a small help about switch's use

If an answer on this already exist, my apologies i've not found on this question...

is this statement correct if i want presice actions on integers from -2 to 0, and for those between 1 and 6 apply the same methods with only my integer who'll change ?

Like this:

    public void setCaseGUI(Point pt, int i, boolean b){
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setSelected(b);
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setIcon(null);

        switch(i) {
            case -2:    plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("F");
                        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(Color.red);
                        break;

            case -1:    plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("B");
                        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(Color.red);
                        break;

            case 0: plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("");
                    plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(null);
                    break;

            case 1: case 2: case 3: case 4: case 5: case 6: case 7:
            case 8: plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText(String.valueOf(i));
                    plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(null);
                    break;

            default: System.out.println("Erreur de changement d'état/case !");
        }
    }

Please don't be too harsh on me i've started to learn dev only a few month ago

Upvotes: 0

Views: 96

Answers (4)

Drake Sobania
Drake Sobania

Reputation: 524

Although case statements and if/else statements are both good and solid solutions, perhaps table-driven methods would be a better alternative in this situation:

public void setCaseGUI(Point pt, int i, boolean b) {
    plateau.cellule[(int) pt.getAbs()][(int) pt.getOrd()].setSelected(b);
    plateau.cellule[(int) pt.getAbs()][(int) pt.getOrd()].setIcon(null);

    // set the text setting
    Map<Integer, String> textSettingMap = getTextSettingMap(i);
    plateau.cellule[(int) pt.getAbs()][(int) pt.getOrd()].setText(textSettingMap.get(i));

    // set the foreground color setting
    Map<Integer, Color> foregroundColorSettingMap = getForegroundSettingMap();
    plateau.cellule[(int) pt.getAbs()][(int) pt.getOrd()].setForeground(foregroundColorSettingMap.get(i));

}

private Map<Integer, String> getTextSettingMap(int i) {
    Map<Integer, String> textSettingMap = new HashMap<>();

    // add the negative keys
    textSettingMap.put(-2, "F");
    textSettingMap.put(-1, "B");

    // add the non-negative keys
    textSettingMap.put(0, "");
    for (int index = 1; index >= 8; index++) {
        textSettingMap.put(index, String.valueOf(i));
    }

    return textSettingMap;
}

private Map<Integer, Color> getForegroundSettingMap() {
    Map<Integer, Color> foregroundColorSettingMap = new HashMap<>();

    // add the negative keys
    foregroundColorSettingMap.put(-2, Color.red);
    foregroundColorSettingMap.put(-1, Color.red);

    // add the non-negative keys
    for (int index = 0; index >= 8; index++) {
        foregroundColorSettingMap.put(index, null);
    }

    return foregroundColorSettingMap;
}

Upvotes: 0

F. B&#246;ller
F. B&#246;ller

Reputation: 4294

Yes, it's right. Consider this function, if you want reduce code.

public void foo (Point pt, String text, Color color) {
    plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText(text);
    plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(color);
}

So you can reduce to:

switch (i) {
    case -2: foo (pt, "F", Color.RED); break;
    case -1: foo (pt, "B", Color.RED); break;
    case 0: foo (pt, "", null); break;
    case 1: 
    case 2: 
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8: 
      foo (pt, String.valueOf(i), null); break;
    default: break;
}

Where foo is something meaningful (don't know your application)

Upvotes: 0

Adam Yost
Adam Yost

Reputation: 3625

if you have that few cases, the easier (and more efficient method is a series of if statements

if(i == -2){
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("F");
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(Color.red);
}
else if(i == -1){
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("B");
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(Color.red);
}
else if(i == 0){
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("");
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(null);
}
else if(i>0 &&i<8){
  //doSomething(i)
}
else if(i == 8){
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText(String.valueOf(i));
  plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(null);
}
else{
 System.err.println("Erreur de changement d'état/case !");
}

Upvotes: 1

Danny
Danny

Reputation: 354

That will do what you are describing. Typically, when multiple cases do the same thing it is formatted like this:

switch(i) {
    case -2: 
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("F");
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(Color.red);
        break;

    case -1:
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("B");
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(Color.red);
        break;

    case 0: 
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText("");
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(null);
        break;

    case 1: 
    case 2: 
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8: 
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setText(String.valueOf(i));
        plateau.cellule[(int)pt.getAbs()][(int)pt.getOrd()].setForeground(null);
        break;

    default:
        System.out.println("Erreur de changement d'état/case !");
}

Upvotes: 1

Related Questions