Как найти максимальный элемент двумерного массива java

Если правильно понял, то проблема возникла при выводе максимального значения элемента двумерного массива? Вот рабочий вариант:

package untitled;

import java.io.*;

public class Main{
    public static void main(String[] args)
            throws java.io.IOException {
        int n = 5, max = 0, m = 6, maxb = 0, nn = 3, cn = 8;
        int[] a = new int[n]; //создание одномерного массива
        System.out.println("Одномерный массив:");
        for (int i = 0; i < a.length; i++) { //заполнение массива случайными числами в интервале [-7; 5]
            a[i] = (int) Math.round((Math.random() * 13) - 7);
            System.out.print(a[i] + "  ");
        }
        for (int i = 0; i < a.length; i++) {
            if (max < a[i]){
                max = a[i];
            }
        }
        System.out.println(" ");
        System.out.println("Максимальный элемент одномерного массива " + max);
        int[][] b = new int[n][m];
        System.out.println("Двумерный массив:");
        for (int i = 0; i < b.length; i++) {
            for(int j = 0; j < b[i].length; j++) {
                b[i][j] = a[i] >> j;
                System.out.format("%4d", b[i][j]);
            }
            System.out.println();
        }

        for (int i = 0; i < b.length; i++) {
            for(int j = 0; j < b[i].length; j++) {
                if (maxb < b[i][j]){
                    maxb = b[i][j];
                }
            }
        }
        System.out.println("Максимальный элемент двумерного массива " + maxb);

        int c [][] = new int[nn][cn];
        System.out.println("Нерегулярный массив:");
        for(int i = 0; i < c.length; i++){
            for(int j = 0; j < c[i].length; j++){
                c[i][j] = 3 * i + j + maxb;
                System.out.format("%4d", c[i][j]);
            }
            System.out.println();
        }
    }
}

Результат получился в виде:

Одномерный массив:
-1  -5  1  6  2   
Максимальный элемент одномерного массива 6
Двумерный массив:
  -1  -1  -1  -1  -1  -1
  -5  -3  -2  -1  -1  -1
   1   0   0   0   0   0
   6   3   1   0   0   0
   2   1   0   0   0   0
Максимальный элемент двумерного массива 6
Нерегулярный массив:
   6   7   8   9  10  11  12  13
   9  10  11  12  13  14  15  16
  12  13  14  15  16  17  18  19

UPDATE

Проблема была с следующем фрагменте кода

    for(int i = 0; i<b.length; i++){
        for(int j = 0; j<b[i].length; j++){
            if (b[i][maxb] < b[i][j]){
                maxb=j;
            }
        }
    }

А именно была допущена ошибка в условии if (b[i][maxb] < b[i][j]) и действии выполняемом при условии. Исходя из поставленной задачи данных циклов, а именно поиск максимального значения элемента двумерного массива, необходимо определить, какое число будет больше от исходного maxb=0; для использования в следующих циклах. В следствии допущенной ошибки в условии переменная maxb оставалась всегда равной нулю, что приводило к дальнейшей ошибке выполнения алгоритма.

Проблему решил исправив условие в данном фрагменте кода, а так же действии выполняемом в случае истинности условия.

        for (int i = 0; i < b.length; i++) {
            for(int j = 0; j < b[i].length; j++) {
                if (maxb < b[i][j]){
                    maxb = b[i][j];
                }
            }
        }
        System.out.println("Максимальный элемент двумерного массива " + maxb);

На данном фрагменте мы сравниваем значение переменной maxb со значением элемента двумерного массива. Если значение maxb меньше значения элемента массива, тогда в переменную maxb присваивается это значение элемента.

Faridik

1 / 1 / 0

Регистрация: 12.04.2010

Сообщений: 42

1

Найти в двумерном массиве наибольший по модулю элемент и его индексы

01.06.2015, 10:08. Показов 11944. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день. Простая задача. Найти в двумерном массиве наибольший по модулю элемент и его индексы. У меня выходят ответы в обоих массивах. Как я могу выводить один ответ, то есть наибольший по двум массивам, а не по каждому в раздельности.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int mas [][] = {{9, 6, -7, 3, -5},
                {-6, -3, 10, 2, 1}
        };
        int max=0;
        for (int i=0; i<mas.length; i++)
        {
            for (int j=0;j<mas[i].length; j++)
            {
                if (mas[i][j]>0 && mas[i][j]>max)
                {
                    if (mas[i][j]>max) {
                        max = mas[i][j];
                        System.out.println("max:" + max + "nindexi: i=" + i + " j=" + j);
                    }
                }
            }



0



maximyep

6 / 6 / 1

Регистрация: 03.02.2013

Сообщений: 38

01.06.2015, 10:45

2

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 int mas[][] = {{9, 6, -7, 3, -5},
        {-6, -3, 10, 2, 1}
        };
        int max = 0;
        int x = 0;
        int y = 0;
        for (int i = 0; i < mas.length; i++) {
            for (int j = 0; j < mas[i].length; j++) {
                if (mas[i][j] > 0 && mas[i][j] > max) {
                    if (mas[i][j] > max) {
                        max = mas[i][j];
                        x = i;
                        y = j;
                       //    System.out.println("max:" + max + "nindexi: i=" + i + " j=" + j);
                    }
                }
            }
        }
        System.out.println("max:" + max + "nindexi: i=" + x + " j=" + y);



1



1 / 1 / 0

Регистрация: 12.04.2010

Сообщений: 42

01.06.2015, 11:55

 [ТС]

3

Спасибо. Я не знал про х и у.



0



635 / 527 / 165

Регистрация: 01.04.2010

Сообщений: 1,843

01.06.2015, 13:05

4

maximyep, а теперь поищи максимум в массиве из отрицательных элементов.



0



maximyep

6 / 6 / 1

Регистрация: 03.02.2013

Сообщений: 38

01.06.2015, 13:40

5

У ТС-а был вопрос почему два раза выводится число.

Ответ на твой вопрос, учитывая старт-пост:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int mas[][] = {{-9, -6, -7, -3, -5},
        {-6, -3, -10, -2, -1}
        };
        int max = mas[0][0];
        int x = 0;
        int y = 0;
        for (int i = 0; i < mas.length; i++) {
            for (int j = 0; j < mas[i].length; j++) {
 
                if (java.lang.Math.abs(mas[i][j]) > max) {
                    {
                        max = java.lang.Math.abs(mas[i][j]);
                        x = i;
                        y = j;
                        //    System.out.println("max:" + max + "nindexi: i=" + i + " j=" + j);
                    }
                }
            }
        }
        System.out.println("max:" + max + "nindexi: i=" + x + " j=" + y);



0



Pablito

2882 / 2294 / 769

Регистрация: 12.05.2014

Сообщений: 7,978

01.06.2015, 14:45

6

это новая мода, две скобки на открытие и закрытие?

Java
1
2
3
4
if (java.lang.Math.abs(mas[i][j]) > max) {
                    {
}
                }



0



I want to find the maximum value of the two-dimensional array. I found this value without using multithreading. How do I find the maximum value of the two-dimensional array using multithreading? I want to compare the speed of finding the maximum value of the array in different ways.

public class Search {

    public int[][] fillMatrix(int matrix[][]) {
        for (int i = 0; i < matrix.length; i++){
            for (int j = 0; j < matrix[i].length; j++){
              matrix[i][j] = (int)(Math.random() * 1000);
            }
        }
        return matrix;
    }

    public int searchMaxValue(int[][] matrix, int row, int column) {
        int max = matrix[0][0];
        for (int a = 0; a < row; a++) {
            for (int b = 0; b < column; b++) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (matrix[a][b] > max) {
                    max = matrix[a][b];
                }
            }
        }
        return max;
    }


    public static void main(String[] args) {

        Search search = new Search();
        int[][] matrix = new int[4][100];
        search.fillMatrix(matrix);
        long start = System.currentTimeMillis();
        int max = search.searchMaxValue(matrix, 4, 100);
        long end = System.currentTimeMillis();
        System.out.println("Max value is " + max);
        System.out.println("Time for execution: " + (end - start));
    }
}

asked Jun 5, 2016 at 14:36

Kirk_Hammett's user avatar

1

Here is the outline how you would go about implementing this. I am not providing code intentionally, so that you can have the joy of implementing it yourself.

create a method to findmax out of an array lets call it findMax(int[]
input)

for each sub array in 2D array (can be accessed using matrix[i])
start a thread to findMax(matrix[i]) (hint: use ExecutorService)
in the thread, once max is found, fill it in to ith position
of a one dimensional array called results in the thread, indicate
its completion(hint: use CountDownLatch)

In the main thread, wait till all threads finish ( hint: use
CountDownLatch) Now call findMax(results) and you have the
maxiumum from matrix.

Considerations: Do we need to fork as many threads as the rows in matrix? So do we use a FixedThreadPool with number of rows ?

answered Jun 6, 2016 at 14:02

ring bearer's user avatar

ring bearerring bearer

20.2k7 gold badges59 silver badges71 bronze badges

1

The simplest way would be to start a thread to calculate the maximum in each of the four rows in the matrix, have the main thread join all of these row threads and calculate the maximum of the four row maxima. You will likely need a much larger array to be able to see the time difference, though. Don’t neglect the necessary synchronization.

If as I suspect you are looking for code, you should make an attempt at the solution and run it, then repost or elaborate this post with the problems you run into.

answered Jun 5, 2016 at 14:50

Warren Dew's user avatar

Warren DewWarren Dew

8,7623 gold badges30 silver badges44 bronze badges

Here is how to do it in java 8:

int[][] values = fillMatrix(new int[1000][1000]);
OptionalInt max = Arrays.stream(values)
    .parallel()
    .flatMapToInt(Arrays::stream)
    .parallel()
    .max();

But frankly speaking, I’m not sure that for such simple computation it makes sense to use several threads, indeed creating and orchestrating threads has a price which seems to be too high in this case.

Response Update

As it is your homework, I provide an answer without any comments on purpose in order to ensure that you will at least think about how it works, but the main idea is to provide chunk of data to each thread to avoid collisions as next:

int[][] matrix = fillMatrix(new int[100][100]);
int totalThreads = 10;
int[] results = new int[totalThreads];
int chunkSize = matrix.length / totalThreads;
CountDownLatch end = new CountDownLatch(totalThreads);
for (int i = 0; i < totalThreads; i++) {
    int threadIndex = i;
    new Thread(
        () -> {
            int max = -1;
            int startIndex = threadIndex * chunkSize;
            for (int j = startIndex; j < startIndex + chunkSize && j < matrix.length; j++) {
                for (int k = 0; k < matrix[j].length; k++) {
                    if (max == -1 || max <  matrix[j][k]) {
                        max = matrix[j][k];
                    }
                }
            }
            results[threadIndex] = max;
            end.countDown();
        }
    ).start();
}
end.await();
int max = results[0];
for (int k = 1; k < results.length; k++) {
    if (max < results[k]) {
        max = results[k];
    }
}
System.out.printf("Max found %d%n", max);

answered Jun 5, 2016 at 16:48

Nicolas Filotto's user avatar

Nicolas FilottoNicolas Filotto

43.2k11 gold badges94 silver badges122 bronze badges

4

Часто сталкиваюсь с проблемой понимания кода, вернее его написания. Когда вроде бы читаешь и понимаешь какая строка что делает, а сам такое повторить почему то не можешь. Но проблемы проблемами, а задачи нужно решать, и так
Дан двумерный массив размером 5х6, заполненный случайным образом. Заменить максимальный элемент каждой строки на противоположный. Написал что-то вроде этого

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m,n,i,j;
System.out.print("Введите количество строк = ");
m = in.nextInt();
System.out.print("Введите количество столбцов = ");
n = in.nextInt();
int[][] mass = new int[m][n]; // создание массива
for (i=0;i<m;i++) {
for (j=0;j<n;j++) {
mass [i][j]=(int) (Math.random()*(20)+1);}}
for (i=0;i<n;i++){
for (j=0;j<n;j++){
System.out.printf("%d ",mass[i][j]);
}
System.out.println(""); // его заполнение и вывод
}
int max, maxi = 0;
for(i=0;i<n;i++) {
max = mass[i][0];
if (mass[i][0]>=max){
max = mass[i][0];
maxi=i; // тут постарался найти максимальный элемент чтобы в будущем заменить
}
}
}
}

Далее, как я понимаю, нужно найти еще и минимальный элемент, чтобы в будущем maxi заменить на mini, но как это сделать?(К сожалению сейчас не могу попробовать тк нет под рукой нетбинса)
может примерно так?

int min, mini = 0;
for(i=0;i<n;i++) {
min = mass[i][0];
if (mass[i][0]<=min) {
min = mass[i][0];
mini = i;

и потом просто max = min? а вывести это как?
Заранее спасибо за ответ, и просто тем, кто прочел эту гору текста

3 ответа

Вот схема, как вы собираетесь реализовать это. Я не предлагаю код намеренно, чтобы вы могли радоваться от его реализации.

создать метод findmax из массива позволяет называть его findMax(int[] input)

для каждого вспомогательного массива в 2D-массиве (можно получить доступ с использованием matrix[i])
запустите нить, чтобы findMax(matrix[i]) (подсказка: используйте ExecutorService) в потоке, как только max будет найден, залейте его в i ю позицию одномерного массива, получившего results в потоке, укажите его завершение (подсказка: используйте CountDownLatch)

В главном потоке дождитесь окончания всех потоков (подсказка: используйте CountDownLatch) Теперь вызовите findMax(results) и у вас есть maxiumum от матрицы.

Соображения: Нужно ли нам развивать столько потоков, сколько строк в матрице? Так мы используем FixedThreadPool с количеством строк?

ring bearer
06 июнь 2016, в 11:31

Поделиться

Вот как это сделать в java 8:

int[][] values = fillMatrix(new int[1000][1000]);
OptionalInt max = Arrays.stream(values)
    .parallel()
    .flatMapToInt(Arrays::stream)
    .parallel()
    .max();

Но, честно говоря, я не уверен, что для таких простых вычислений имеет смысл использовать несколько потоков, в действительности создание и упорядочение потоков имеет цену, которая в этом случае кажется слишком высокой.

Обновление ответа

Поскольку это ваша домашняя работа, я предоставляю ответ без каких-либо комментариев с целью убедиться, что вы, по крайней мере, подумаете о том, как это работает, но основная идея – предоставить кусок данных для каждого потока, чтобы избежать столкновений следующим образом:

int[][] matrix = fillMatrix(new int[100][100]);
int totalThreads = 10;
int[] results = new int[totalThreads];
int chunkSize = matrix.length / totalThreads;
CountDownLatch end = new CountDownLatch(totalThreads);
for (int i = 0; i < totalThreads; i++) {
    int threadIndex = i;
    new Thread(
        () -> {
            int max = -1;
            int startIndex = threadIndex * chunkSize;
            for (int j = startIndex; j < startIndex + chunkSize && j < matrix.length; j++) {
                for (int k = 0; k < matrix[j].length; k++) {
                    if (max == -1 || max <  matrix[j][k]) {
                        max = matrix[j][k];
                    }
                }
            }
            results[threadIndex] = max;
            end.countDown();
        }
    ).start();
}
end.await();
int max = results[0];
for (int k = 1; k < results.length; k++) {
    if (max < results[k]) {
        max = results[k];
    }
}
System.out.printf("Max found %d%n", max);

Nicolas Filotto
05 июнь 2016, в 14:04

Поделиться

Самый простой способ – запустить поток для вычисления максимума в каждой из четырех строк в матрице, связать основной поток со всеми этими потоками строк и рассчитать максимум максимумов четырех строк. Скорее всего, вам понадобится гораздо больший массив, чтобы видеть разницу во времени. Не пренебрегайте необходимой синхронизацией.

Если, как я подозреваю, вы ищете код, вы должны попытаться решить проблему и запустить ее, а затем перекомпостировать или обработать этот пост с проблемами, с которыми вы столкнулись.

Warren Dew
05 июнь 2016, в 12:06

Поделиться

Ещё вопросы

  • 0Удаление опций из Выбрать с помощью Jquery
  • 1Выражение Linq из Lambda: укажите параметр явно
  • 0JQuery position.top () медленный с большим количеством элементов
  • 2отправка файла с модификацией 2, имя файла которого содержит персидский символ
  • 1вычислить определитель матрицы
  • 0Почему мой код выводит только часть входной строки?
  • 1Если использование ключевого слова «new» в Java подразумевает распределение памяти, почему это не относится к анонимному внутреннему классу?
  • 1Удалить строку из файла с пустыми полями, используя Python
  • 0Как изменить свойство CSS id в зависимости от размера экрана
  • 1Перестановка элементов между A и B для получения равенства сумм
  • 1Silk Test не идентифицирует элемент управления WPF, размещенный на хосте Windows Forms
  • 0MySQL: нужно выбрать список уникальных названий улиц из таблицы адресов
  • 0Не могу скомпилировать тестовую программу PostgreSQL
  • 1Как я могу перебрать список элементов и извлечь определенную часть, используя Selenium и Python
  • 0Magento – показать комментарии заказа на phtml
  • 0как узнать при проверке радио кнопки?
  • 0Наложение jQuery .fadeIn () (после просмотра другой вкладки браузера)
  • 1Угадай секретный номер Java
  • 1Создание новой даты из разницы / вычитание двух периодов (с отрицательным временем)
  • 1Правильно установить приоритеты между правилами и терминалами в грамматике для жаворонка
  • 0Горизонтальная прокрутка изображения с помощью запроса
  • 1Как извлечь все промежутки на странице, используя iMacros?
  • 1Я пытаюсь вернуть список, заполнив дочерний узел
  • 0codeigniter получить количество num_rows
  • 1Как правильно импортировать хэш md5 в файл машинописи Angular 2?
  • 1Привязка данных: «System.Xml.linq.XElement» не содержит свойство с именем «colorName»
  • 0У меня есть ошибка с использованием этого-> в C ++
  • 0JQuery загрузить страницу в диалог
  • 1Visual Studio: ошибка указанного пути не поддерживается
  • 1Строка соединения Entity Framework для удаленного сервера
  • 1Могу ли я экспортировать куки из python в Chrome?
  • 0Сайт остановился, когда jQuery ajax загрузил большой элемент
  • 1Javascript, имя функции с интерполяцией строк [дубликаты]
  • 1Служебный работник получает событие handleR с пружиной MVC
  • 1Использование PowerShell в качестве двоичного файла CGI в IIS Express
  • 0Мышление по-угловому
  • 1JPA Criteria API, использующий ISNULL в порядке следования
  • 1Кратчайший путь от города 0 до N (автомобильным / воздушным смешанным тарифом)
  • 0Получение ожидаемой ошибки неквалифицированного идентификатора с C ++ при попытке выполнить
  • 0Как рассчитать с помощью php сумму с процентом НДС в PHP
  • 0Невозможно получить доступ к элементу из класса сортировки c ++
  • 0У вас есть значение индекса копирования столбца при вставке?
  • 1System.ServiceModel.ProtocolException: удаленный сервер возвратил неожиданный ответ: (413) слишком сложный объект запроса
  • 1чтение файла xml и переупорядочение элементов на основе схемы xsd
  • 1Условные утверждения странно действуют в моем скребке
  • 0Как можно заполнить сгенерированный JQuery со значениями 1-52
  • 1короткие клавиши для меню не работает в wpf в призме
  • 0Как вставить массивы со значениями объектов в MySQL, используя для или foreach в JavaScript (nodejs)?
  • 1Как удалить все неиспользуемые переменные в WebStorm?
  • 1Xpath: найти div, который следует за известным div (не вложенным)

Добавить комментарий