13
votes

Je suis presque sûr de trop compliquer mes boucles mais je ne sais pas comment simplifier

Comme le titre l'indique, j'ai juste besoin d'aide / de conseils sur la façon dont je peux simplifier une partie de mon code. J'obtiens le rendement que je veux mais il est évident de voir que la façon dont je m'y prends est un peu excessive. Ce que j'essaie de faire dans mon programme, c'est de passer le tableau

int length = 8;
[0] = 1;
[1] = 2;
[2] = 1;
[3] = 1;
[4] = 1;
[5] = 2;
[6] = 2;
[7] = 2;

Dans ma méthode buildFeetArray qui prend juste les éléments du tableau, les divise par 12 pour obtenir une nouvelle valeur d'élément qui est ensuite placée dans un nouveau tableau qui est retourné. Voici la méthode

 public static int[] buildFeetArray(int[] arrayParam) {
    int sum = 0;
    int lessthan1 = 0;
    int lessthan2 = 0;
    int lessthan3 = 0;
    int lessthan4 = 0;
    int lessthan5 = 0;
    int lessthan6 = 0;
    int lessthan7 = 0;
    int lessthan8 = 0;
    for (int count = 0; count < arrayParam.length; count++) {
        if (arrayParam[count] / 12 == 0) {
            lessthan1++;
        } else if (arrayParam[count] / 12 == 1) {
            lessthan2++;
        } else if (arrayParam[count] / 12 == 2) {
            lessthan3++;
        } else if (arrayParam[count] / 12 == 3) {
            lessthan4++;
        } else if (arrayParam[count] / 12 == 4) {
            lessthan5++;
        } else if (arrayParam[count] / 12 == 5) {
            lessthan6++;
        } else if (arrayParam[count] / 12 == 6) {
            lessthan7++;
        } else if (arrayParam[count] / 12 == 7) {
            lessthan8++;
        }
    }
    int[] newArray = {lessthan1, lessthan2, lessthan3, lessthan4, lessthan5, lessthan6, lessthan7, lessthan8};
    return newArray;
}

Idéalement, la sortie devrait être

int [] myInches = {89,12,33,7,72,42,76,49,69,85,61,23};

Ce que c'est, mais il y a certainement un moyen plus simple de s'y prendre, si possible, j'aimerais éviter d'utiliser des listes et de m'en tenir aux boucles car j'ai besoin de m'entraîner avec elles. Merci d'avance pour tous conseils / astuces.


2 commentaires

Le code de votre question ne correspond pas du tout à la spécification. J'ai du mal à comprendre ce que fait le code, pour être honnête, mais il ne fait clairement pas ce que vous prétendez faire. Pouvez-vous donner une spécification précise de ce que le code est censé faire?


Il semble que vous renvoyez le nombre d'entrées qui ont 1, 2, 3, 4, etc. pieds, ce qui ne correspond pas à ce que vous dites. De plus, la dénomination «lessThan» n'a aucun sens puisque lessThan8 devrait être toutes les entrées fournies.


6 Réponses :


5
votes

Vous pouvez utiliser un bloc Switch:

switch(arrayParam[count]/12){
  case 0:
    lessthan1++;
    break;
  case 1:
    lessthan2++;
    break;
  //and so on...
}

L'effet est le même mais il a l'air beaucoup plus propre et il est pratique dans des situations comme celle-ci


0 commentaires

11
votes

Vous pouvez utiliser un autre tableau pour stocker le résultat, par exemple:

public static  int[] buildFeetArray(int [] arrayParam) {

    int[] lessThanArray = new int[8];

    for (int count = 0; count < arrayParam.length; count++) {
        for (int remainder = 0; remainder < lessThanArray.length; remainder++) {

            if (arrayParam[count] / 12 == remainder) {

                lessThanArray[remainder]++;
                break; // exit from the inner "for" loop
            }
        }
    }

    return lessThanArray;
}


1 commentaires

Pourtant, il n'y a vraiment aucune raison d'utiliser une deuxième boucle pour cela; cela ne fait qu'ajouter à la confusion.



21
votes

J'ai écrit un pseudo-code pour cela, dans lequel vous devez simplement initialiser un tableau et incrémenter un index particulier du tableau lorsqu'une certaine condition correspond:

public static int [] buildFeetArray(int [] arrayParam) {
    int index;
    int [] lessthan = {0,0,0,0,0,0,0,0};
    for (int count = 0; count < arrayParam.length; count++) {
        index = arrayParam[count]/12;
        if(index < 8 ) {
            lessthan[index]++;
        }
    }
    return lessthan;
}


0 commentaires

10
votes

Et ça:

int[] lessThanArray = new int[8];
for (int entry: myInches) {
    int lessThan = entry / 12;
    if (lessThan < 8) { 
        lessThanArray[lessThan]++;
    }
}


0 commentaires

3
votes

Nous pouvons utiliser certaines API Java-8 pour le rendre encore plus court.

[1, 2, 1, 1, 1, 2, 2, 2]

Explication :

  • Créer un tableau temporaire
  • Itérer à travers un flux d'entiers générant des valeurs d'index jusqu'à la longueur du tableau d'entrée.

  • Dans chaque itération, trouver l'indice à la suite de la division avec 12 et incrémenter le compteur, soit 89/12 = 7 donc on incrémente le compteur du 7 e index. Cela dénoterait lessthan8 variable dans votre code.

  • Renvoie un tableau de la longueur souhaitée en passant un paramètre de length supplémentaire.

Contribution:

int[] res = buildFeetArray(new int[]{89,12,33,7,72,42,76,49,69,85,61,23}, 8);

Production:

public static  int [] buildFeetArray(int [] arrayParam, int length) {
       int [] result = new int[arrayParam.length];
       IntStream.range(0, arrayParam.length).forEach(i -> result[arrayParam[i] / 12] = result[arrayParam[i] / 12] + 1 );
       return Arrays.copyOf(result, length);
 }


0 commentaires

3
votes

J'ai simplement modifié un peu votre code. Vous pouvez essayer ceci:

public static  int [] buildFeetArray(int [] arrayParam) {
    int sum = 0;
    int len=8; // your ideal lengh, change it if needed
    int[] lessthan = new int[len+1];
    for(int i=0; i<len+1; i++){ lessthan[i]=0; }

    for (int count = 0; count < arrayParam.length; count++) {
        int d = arrayParam[count]/12;
        d = d+1; 
        lessthan[d]++;
        // so, if arrayParam[count]/12 == 0,1,2,..., then d = 1,2,3,...  
        
    }
    return lessthan;
}
    


1 commentaires

Votre solution est techniquement incorrecte, veuillez relire la question attentivement