Cinq notes sont reçues au hasard, stockées sous forme de notes et produites sous forme de notes et de notes.

public class asdf {
    public static void main(String[] args) {
        ArrayList<String> grade = new ArrayList<String>(5);

        HashMap<Integer, String> score = new HashMap<Integer, String>(){{
            put(4,"A");
            put(3,"B");
            put(2,"C");
            put(1,"D");
            put(0,"F");
        }};
        Random rand = new Random();
        for (int i = 0; i < 5; i++) {
            grade.add(score.get(rand.nextInt(5)));
        }
        for (int i = 0; i < grade.size(); i++) {
            if(grade.get(i) == "A")
                System.out.println("4, A");
            else if(grade.get(i) == "B")
                System.out.println("3, B");
            else if(grade.get(i) == "C")
                System.out.println("2, C");
            else if(grade.get(i) == "D")
                System.out.println("1, D");
            else if(grade.get(i) == "F")
                System.out.println("0, F");
        }

    }
}

Existe-t-il un moyen plus efficace?

Je veux changer efficacement la syntaxe if-else, mais je ne sais pas comment.

-4
senflij 2 juin 2020 à 21:09

4 réponses

Initialiseurs à double accolade {{ ... }} - cela a l'air sophistiqué, mais se fait au détriment des performances. Je recommande de ne pas l'utiliser. Appelez plutôt .put() plusieurs fois.

Pourquoi stockez-vous grade? Vous pouvez utiliser directement la valeur aléatoire si la note n'est pas référencée plus loin dans le code.

En fait, au lieu de stocker les notes, vous devez stocker le score. Travaillez toujours avec ce qu'est la clé du HashMap, sinon il ne sert à rien d'utiliser le Map.

Votre code peut être condensé en:

List<Integer> scores = new LinkedList<>();
for (int i = 0; i < 5; i++) {
    scores.add(rand.nextInt(5));
}
for (int i = 0; i < scores.size(); i++) {
    System.out.println(scores.get(i) + " " + score.get(scores.get(i)));
}

Vous comparez des chaînes incorrectement. Utilisez .equals() au lieu de ==.

0
Harshal Parekh 2 juin 2020 à 18:31

Il existe plusieurs options pour résoudre ces IF:

  1. Vous pouvez utiliser une BiMap pour débarrassez-vous de ces IF embêtantes.

  2. Vous pouvez conserver le HashMap et changer la valeur en un objet d'une classe comme Score qui contient à la fois la note et la valeur numérique.

  3. Vous pouvez créer une énumération Grade et résoudre ce problème.

-1
Siddharth Srivastava 2 juin 2020 à 18:22

Existe-t-il un moyen plus efficace?

Je ne sais pas pourquoi vous avez stocké les notes en tant que String alors qu'un Integer faciliterait la tâche.

List<Integer> grade = new ArrayList<>();
Map<Integer,String> score = new HashMap<>(Map.of(4,"A",3,"B",2,"C",1,"D", 0,"F"));

Random rand = new Random();
for (int i = 0; i < 5; i++) {
    grade.add(rand.nextInt(5));
}
for (int g : grade) {
    System.out.println(g + ", " + score.get(g));
}

Imprime quelque chose de similaire à.

2, C
4, A
0, F
3, B
2, C

Points à considérer

  • Sauf si la fonctionnalité de l'implémentation est requise, attribuez-lui le type d'interface.
    List<Integer> grade = new ArrayList<>();
  • Pour un petit nombre d'éléments, utilisez Map.of() au lieu de put. Il en résulte une carte immuable. Pour le rendre mutable, passez à HashMap<>()
  • Pensez à utiliser la boucle for améliorée pour parcourir les listes.
    for (int g : grade)
  • Lorsque vous devez comparer Strings utilisez equals et non ==
0
WJS 2 juin 2020 à 19:08

Le cas du commutateur peut être plus concis et intuitif (en interne, jvm l'optimisera probablement de manière très similaire). Si vous ne passez que d'une chaîne à une valeur, il serait préférable de définir la carte comme Hashmap<String,Integer>. En fin de compte, conformément à votre style, il serait plus concis de l'implémenter de cette manière:

public class asdf {
    public static void main(String[] args) {
        ArrayList<String> grade = new ArrayList<String>(5);
        List<String> scores = Arrays.asList("F", "D", "C", "B", "A");
        Random rand = new Random();
        for (int i = 0; i < 5; i++) {
            grade.add(scores.get(rand.nextInt(5)));
        }
        for (int i = 0; i < grade.size(); i++) {
                System.out.println(String.valueOf(scores.indexOf(grade.get(i)))+","+grade.get(i));
        }

    }
}

0
Marius Popescu 2 juin 2020 à 18:45