Нахождение минимального и максимального значения в каждом столбце в массиве - PullRequest
3 голосов
/ 09 февраля 2020

У меня проблема с моей программой. Я хочу напечатать min и max в каждом столбце, но он не работает должным образом. Я думаю, что все должно быть в порядке. Когда l oop заканчивается, я перезагружаю минимальное и максимальное значение.


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]);
      }



  }
}

Ответы [ 4 ]

2 голосов
/ 10 февраля 2020

Не вводите и не сортируйте одновременно, поскольку элементы все еще могут быть инициализированы со значениями по умолчанию (например, 0). Кроме того, во внешнем l oop сбросьте max и min на первый элемент столбца.

Сделайте это следующим образом:

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]);
        }
    }
}

A примерный прогон:

   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

Примечания:

  1. Я изменил r.nextInt(6)-5 на r.nextInt(10) - 5, чтобы получить смесь отрицательных , 0 и положительные числа, чтобы вы могли быстро проверить результат. Вы можете изменить его обратно на r.nextInt(6)-5 согласно вашему требованию.
  2. Я также использовал printf вместо print для печати каждого числа с пробелом в 4 единицы. Вы можете изменить его обратно на print, если у вас sh.
  3. Использование Integer.MAX_VALUE и / или Integer.MIN_VALUE совсем не требуется для решения этой проблемы.

Не стесняйтесь комментировать в случае каких-либо сомнений.

2 голосов
/ 09 февраля 2020

Вы инициализировали min как ноль, я бы предложил Integer.MIN_VALUE. В противном случае положительные значения не могут быть «найдены».

Это также проблема, которую кто-то уже решил для вас, например, с помощью потоков:

assertThat(
        IntStream.of(new int[] { 1, 2, 3, 4, 5 }).max().getAsInt(), 
        is(5));
0 голосов
/ 10 февраля 2020

Сначала в l oop установите min на min = Integer.MAX_VALUE и аналогично max = Integer.MIN_VALUE. Это обеспечит нам, что каждое случайное число будет (по крайней мере) меньше, чем инициализированный min (и аналогично для max)

В этом случае вы рисуете числа от -5 до 0, поэтому вы можете установить min как для пример -6 ​​и максимум 1, а затем вы уверены, что нарисованное число будет больше -6 и меньше 1 и будет корректно обновляться

В вашем коде вы смешали i и j - оно должно быть

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

и аналогично в остальной части кода

Также, когда вы создаете массив в Java, он автоматически инициализируется нулями. Так что

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

означает min = 0, потому что весь массив заполнен нулями, поэтому вам не нужно дублировать код

0 голосов
/ 09 февраля 2020

Ваш первый l oop должен быть над столбцами (j).

t[0].length
...