3 votes

Trouver les valeurs min et max dans chaque colonne d'un tableau

J'ai un problème avec mon programme. Je veux imprimer les valeurs min et max dans chaque colonne mais cela ne fonctionne pas correctement. Je pense que tout devrait être correct. Lorsque la boucle se termine, je redémarre les valeurs min et max.

public class tablice2 {
  public static void main(String[] args){
      int t [][] = new int [5][5];
      int n [] = new int [5];
      int x [] = new int [5];
      Random r = new Random();
      int min  = t[0][0];
      int max = t[0][0];

      for (int i = 0; i <t.length ;i++){
          min = 0;
          max = 0;
          for(int j = 0; j < t[i].length ;j++){
            t[i][j] = r.nextInt(6)-5;
              System.out.print(t[i][j] + " ");

              if (t[j][i] < min){
                  min = t[j][i];
              }

              if (t[j][i] > max){
                  max = t[j][i];
              }

          }
          n[i]=min;
          x[i]=max;

          System.out.println(" ");
      }

      for(int p=0;p<x.length;p++){
          System.out.println("Max Column "+p + ": " +x[p] );
      }

      for(int k=0;k<n.length;k++){
          System.out.println("Min Column "+k + ": " +n[k]);
      }

  }
}

0 votes

Vous initialisez min à zéro. on ne peut lui attribuer que des valeurs inférieures à cela (négatives ?) mais le hasard produit des valeurs positives

2voto

Darkwyng Points 100

Vous avez initialisé min comme zéro, je suggère Integer.MIN_VALUE . Sinon, les valeurs positives ne peuvent pas être "trouvées".

C'est aussi le genre de problème que quelqu'un a déjà résolu pour vous, par exemple via les flux :

assertThat(
        IntStream.of(new int[] { 1, 2, 3, 4, 5 }).max().getAsInt(), 
        is(5));

2voto

Arvind Kumar Avinash Points 49501

Ne pas saisir et trier en même temps car les éléments peuvent encore être initialisés avec les valeurs par défaut (c.-à-d. 0 ). De même, dans la boucle externe, la réinitialisation max y min au premier élément de la colonne.

Faites-le comme suit :

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int t[][] = new int[5][5];
        int n[] = new int[5];
        int x[] = new int[5];
        Random r = new Random();
        int min;
        int max;

        for (int i = 0; i < t.length; i++) {
            for (int j = 0; j < t[i].length; j++) {
                t[i][j] = r.nextInt(10) - 5;
                System.out.printf("%4d", t[i][j]);
            }
            System.out.println();
        }

        for (int i = 0; i < t.length; i++) {
            min = t[0][i];
            max = t[0][i];
            for (int j = 0; j < t[i].length; j++) {
                if (t[j][i] < min) {
                    min = t[j][i];
                }
                if (t[j][i] > max) {
                    max = t[j][i];
                }
            }
            n[i] = min;
            x[i] = max;
        }

        for (int p = 0; p < x.length; p++) {
            System.out.println("Max Column " + p + ": " + x[p]);
        }

        for (int k = 0; k < n.length; k++) {
            System.out.println("Min Column " + k + ": " + n[k]);
        }
    }
}

Un exemple d'exécution :

   3  -4   2   0   1
  -2  -2   4  -1  -2
  -3   1   4  -1   0
  -4   4  -2  -5   2
  -5  -3  -3  -4  -1
Max Column 0: 3
Max Column 1: 4
Max Column 2: 4
Max Column 3: 0
Max Column 4: 2
Min Column 0: -5
Min Column 1: -4
Min Column 2: -3
Min Column 3: -5
Min Column 4: -2

Notes :

  1. J'ai changé r.nextInt(6)-5 a r.nextInt(10) - 5 afin de produire un mélange de nombres négatifs, 0 et positifs, ce qui vous permet de valider rapidement le résultat. Vous pouvez le changer à nouveau en r.nextInt(6)-5 selon vos besoins.
  2. J'ai également utilisé printf au lieu de print pour imprimer chaque numéro avec un espace de 4 unités. Vous pouvez le changer à nouveau en print si vous le souhaitez.
  3. Utilisation de Integer.MAX_VALUE et/ou Integer.MIN_VALUE n'est pas du tout nécessaire pour résoudre ce problème.

N'hésitez pas à commenter en cas de doute.

0voto

Tix Points 522

Votre première boucle doit être sur les colonnes(j).

t[0].length

0voto

Andrew Points 78

En premier lieu, dans la boucle, définissez votre min a min = Integer.MAX_VALUE et de même avec max = Integer.MIN_VALUE . Cela nous assure que chaque nombre aléatoire sera (au moins) plus petit que le min initialisé (et similaire pour le max).

Dans ce cas, vous tirez des numéros de -5 à 0, vous pouvez donc définir le minimum comme par exemple -6 et le maximum 1. Vous êtes alors sûr que le numéro tiré sera supérieur à -6 et inférieur à 1 et qu'il sera mis à jour correctement.

Dans votre code, vous avez mélangé i y j - il devrait l'être

if (t[i][j] < min){
    min = t[i][j];
}

et de la même manière dans le reste du code

De plus, lorsque vous créez un tableau en Java, il est automatiquement initialisé avec des 0. Donc

int t [][] = new int [5][5];
int min  = t[0][0];

signifie min = 0 parce que tous les tableaux sont remplis de 0, donc vous n'avez pas à dupliquer votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X