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

Все таки, если есть желание использовать enumerate, то вот так:

l = [[0, 0, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]]

# функция одного прохода, до первого совпадения
# если совпадения не случилось, возвращает None
def find_index_2D(l:list, value:int) -> dict:
    for row, sublist in enumerate(l):
        if (bool(set(sublist) & {value})): 
            return {"row":row, "column":sublist.index(value)}

Но если заглянуть в документацию по enumerate, то можно увидеть, что реализация и эквивалент достаточно просты:

# эквивалент
def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1

то есть можно определить свое n без enumerate и увеличивать с каждым шагом for. То есть, вот так писать тоже нет ничего зазорного:

def find_index_2D(l:list, value:int) -> dict:
    n = 0
    for sublist in l:
        if (bool(set(sublist) & {value})): 
            return {"row":n, "column":sublist.index(value)}
        n += 1

What I’m trying to do is print the largest number within a two dimensional array and it’s index location. I’m able to find the largest number, but I can’t seem to figure out how to print it’s index location. Anyway, here’s what I have so far:

public static void main(String[] args) {
    int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};

    double max = arr[0][0];
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr.length; j++) {
            if (arr[i][j] > max) {
                max = arr[i][j];

            }
        }
    }
    System.out.println(max);
    System.out.println(i + j); //No idea what I should be doing here, just trying out everything I can think of 

asked Sep 23, 2011 at 22:43

MNX1024's user avatar

Right now, you should consistently get 2 * arr.length as the final value. That isn’t what you are probably looking for. It looks like you want to know the coordinates for the max value. To do this, you’ll need to cache the values of the indexes and then use them later:

public static void main(String[] args) {
    int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};
    int tmpI = 0;
    int tmpJ = 0;
    double max = arr[0][0];
    // there are some changes here. in addition to the caching
    for (int i = 0; i < arr.length; i++) {
        int[] inner = arr[i];
        // caches inner variable so that it does not have to be looked up
        // as often, and it also tests based on the inner loop's length in
        // case the inner loop has a different length from the outer loop.
        for (int j = 0; j < inner.length; j++) {
            if (inner[j] > max) {
                max = inner[j];
                // store the coordinates of max
                tmpI = i; tmpJ = j;
            }
        }
    }
    System.out.println(max);
    // convert to string before outputting:
    System.out.println("The (x,y) is: ("+tmpI+","+tmpJ+")");

answered Sep 23, 2011 at 22:48

cwallenpoole's user avatar

cwallenpoolecwallenpoole

79.4k26 gold badges128 silver badges166 bronze badges

4

Be careful with your array dimensions! The second for-statement most of you have is wrong. It should go to up to arr[i].length:

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        if (arr[i][j] > max) {
            max = arr[i][j];
            tmpI = i; tmpJ = j;
        }
    }
}

answered Sep 23, 2011 at 22:53

Costis Aivalis's user avatar

Costis AivalisCostis Aivalis

13.7k3 gold badges46 silver badges47 bronze badges

Store i, j whenever you update max.

answered Sep 23, 2011 at 22:47

Michael Aaron Safyan's user avatar

This would be if you wanted a single index into a flatten array:

public static void main (String[] args) throws java.lang.Exception
{
        int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};
            int[] flattened = new int[6*3]; // based off above
            int maxIndex = 0;
            double max = arr[0][0];
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr.length; j++) {
                    flattened[i + j] = arr[i][j];
                    if (arr[i][j] > max) {
                        max = arr[i][j];
                        maxIndex  = i+j;
                    }
                }
        }
    System.out.println(max);
    System.out.println(flattened [maxIndex]);
}

answered Sep 23, 2011 at 22:53

Joe's user avatar

JoeJoe

80.3k18 gold badges127 silver badges145 bronze badges

int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};

int max = arr[0][0];
int maxI = 0, maxJ = 0;

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr.length; j++) {
        if (arr[i][j] > max) {
            max = arr[i][j];
            maxI = i;
            maxJ = j;
        }
    }
}
System.out.println(max);
System.out.println(maxI + "," + maxJ); 

answered Sep 23, 2011 at 22:55

Bhesh Gurung's user avatar

Bhesh GurungBhesh Gurung

50.3k22 gold badges93 silver badges141 bronze badges

You’ve got a two-dimensional array, therefore you need to know both indexes. Adding them together won’t do because you lose which-is-which. How about this:

System.out.println("[" + i + "][" + j + "]");

Joe's user avatar

Joe

80.3k18 gold badges127 silver badges145 bronze badges

answered Sep 23, 2011 at 22:47

RichW's user avatar

RichWRichW

1,9942 gold badges14 silver badges24 bronze badges

//C++ code
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> b;
vector<int> c;
int Func(int a[][10],int n)
{
    int max;
    max=a[0][0];
    for(int i=0;i<n;i++)
    {
            for(int j=0;j<n;j++)
            {
                    if(a[i][j]>max)
                    {
                                   max=a[i][j];
                                   b.push_back(i);
                                   c.push_back(j);
                                   }

                    }
                    }
                    b.push_back(0);
                    c.push_back(0);
                    return max;
                    }
    void display(int a[][10],int n)
    {
         for(int i=0;i<n;i++)
    {
            for(int j=0;j<n;j++)
            {
                    cout<<a[i][j]<<"t";
                    }
                    cout<<endl;
                    }
                    }

int main()
{
    int a[10][10],n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
            for(int j=0;j<n;j++)
            {
                    cin>>a[i][j];
                    }
                    }
                    cout<<endl;
                    display(a,n);
                    cout<<endl;
                    cout<<Func(a,n)<<" is the greatest "<<endl;
                    if(b.size()==1&&c.size()==1)
                    {
                                            cout<<"Location is (1,1)"<<endl;
                                            }
                                            else
                                            {
                                                 b.erase(b.end() - 1);
                                                 c.erase(c.end() - 1);
                    cout<<"Location is "<<"("<<b.back()+1<<","<<c.back()+1<<")"<<endl;
                    }
                    return 0;
                    }

answered Nov 7, 2012 at 19:26

J V Jeoffer's user avatar

2

You’re just adding the indices i and j together and then printing it to the screen. Since you’re running throug the entire loop it’s just going to be equal to 2*arr.length-2. What you need to do is store the values of i and j when you encounter a new max value.

For example:

int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};

int max = arr[0][0]; //dunno why you made it double when you're dealing with integers
int max_row=0;
int max_column=0;
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr.length; j++) {
        if (arr[i][j] > max) {
            max = arr[i][j];
            max_row=i;
            max_column=j;

        }
    }
System.out.println("The max is: "+max+" at index ["+max_row+"]["+max_column+"]");

answered Sep 9, 2013 at 5:22

Don’t sure that you implement effective algorithm, but why you just don’t save indices i,j in another variables when you set max.
This is very simple.

if (arr[i][j] > max) {
    max = arr[i][j];
    maxX = i;
    maxY = j;
}

FYI If you want look at «insertion sorting» algorithms if you want better implementation.

answered Sep 23, 2011 at 22:53

abdolence's user avatar

abdolenceabdolence

2,3341 gold badge21 silver badges29 bronze badges

Я бы сказал что-то вроде этого:

public static Tuple<int, int> CoordinatesOf<T>(this T[,] matrix, T value)
{
    int w = matrix.GetLength(0); // width
    int h = matrix.GetLength(1); // height

    for (int x = 0; x < w; ++x)
    {
        for (int y = 0; y < h; ++y)
        {
            if (matrix[x, y].Equals(value))
                return Tuple.Create(x, y);
        }
    }

    return Tuple.Create(-1, -1);
}

Dan Tao
16 июль 2010, в 00:27

Поделиться

Вот метод, который должен найти индекс в массиве с произвольным рангом.

… Добавлен диапазон верхних/нижних границ для ранга

public static class Tools
{
    public static int[] FindIndex(this Array haystack, object needle)
    {
        if (haystack.Rank == 1)
            return new[] { Array.IndexOf(haystack, needle) };

        var found = haystack.OfType<object>()
                          .Select((v, i) => new { v, i })
                          .FirstOrDefault(s => s.v.Equals(needle));
        if (found == null)
            throw new Exception("needle not found in set");

        var indexes = new int[haystack.Rank];
        var last = found.i;
        var lastLength = Enumerable.Range(0, haystack.Rank)
                                   .Aggregate(1, 
                                       (a, v) => a * haystack.GetLength(v));
        for (var rank =0; rank < haystack.Rank; rank++)
        {
            lastLength = lastLength / haystack.GetLength(rank);
            var value = last / lastLength;
            last -= value * lastLength;

            var index = value + haystack.GetLowerBound(rank);
            if (index > haystack.GetUpperBound(rank))
                throw new IndexOutOfRangeException();
            indexes[rank] = index;
        }

        return indexes;
    }
}

Matthew Whited
16 июль 2010, в 01:22

Поделиться

Ещё вопросы

  • 0Получить счет из двух разных таблиц на основе datetime в MySQL
  • 0Слайдер изображений jquery не работает в ie8
  • 1Укажите имя БД / схемы Oracle в tomcat context.xml
  • 1документация sikuli 1.0.2 и ScreenRegion
  • 0Каковы преимущества использования KnockoutJS по сравнению с AngularJS?
  • 0Приложение Spring boot с контейнером mysql работает, но с контейнером приложения spring boot оно не работает
  • 0выпадающая навигация в блокноте и перенос в dw cs6, она работает в режиме реального времени, а не в любом тестовом браузере, и мои страницы не связаны
  • 0AngularJS / Javascript — Как я могу заменить весь объект на JSON
  • 0Почему эта переменная работает в nav, а не в теге body?
  • 0Не удается заставить TinyMCE 4.0.6 работать
  • 1Фоновые задачи для регулярной синхронизации файлов
  • 0Функция C ++, возвращающая строку с запятой
  • 0Как решить конфликт с package_find из CMake?
  • 1ASP.NET не может выполнить операцию над файлом, поскольку он используется другим процессом?
  • 0Перемещение строки таблицы td данных вверх и вниз, за исключением первого td этой строки, для изменения порядка данных
  • 0Необходимо преобразовать 16-битные данные в 8-битные
  • 1Как ACCESS_BACKGROUND_LOCATION, представленный в Android Q, влияет на API Geofence?
  • 0Как добавить текст с пробелами для метки с помощью jquery?
  • 1Является ли View или ViewModel ответственным за преобразование данных из модели, представляемой в пользовательском интерфейсе?
  • 1HashTable в Java собственного размера
  • 1Сравните 2 списка с .intersection ()
  • 1Как обновить форматирование в неисчисляемых полях и обновить вычисляемые поля в заполняемой форме PDF
  • 1Фильтрация ботов и пауков для рекламной системы. Блокировка зашла слишком далеко
  • 0fnfilter проблема поиска в datatables
  • 0Найти функцию в тексте
  • 1Python Pandas, чтение в файле и пропуск строк перед заголовком
  • 1Android, как я могу выбрать изображение с камеры или галереи одновременно с одним намерением
  • 1Наблюдаемый список Приведение / Конверсия
  • 0JQuery флажок проблемы
  • 0Как привязать сгенерированные d3 HTML-элементы к области видимости?
  • 0Вставить несколько строк в laravel с полезной нагрузкой JSON
  • 0Мой текст вращается, но фоновое изображение не
  • 1Команды вибрации и уведомления не работают
  • 0MySQL Insert Slow в AWS RDS
  • 1Работа с Python2 и Python3 в одном проекте
  • 0Необходимо найти МАКСИМАЛЬНОЕ значение между двумя датами аукциона
  • 0Итерация по векторному столбцу C ++
  • 1Ember простой поддельный сервис не отображается на странице
  • 1Нажмите: как применить действие ко всем командам и подкомандам, но разрешить команде отказаться (часть duex)?
  • 0Что означают числа с утверждениями равенства в предложении WHERE в SQL (WHERE 2> 1)?
  • 1Разрешить двойному щелчку пользовательского файла и открывать мое приложение при загрузке его данных
  • 0Как очистить текстовое поле onfocus, если оно содержит ноль, и onfocusout, если оно пустое, затем поставить ноль?
  • 0Отображение man-страницы в C ++
  • 1прокси nginx для клиента Javascript WebSocket
  • 0Удаление объекта в AngularJS
  • 0Отрицательные биты не работают как ожидалось PHP
  • 1Запись в существующий XML-файл без замены его содержимого (XmlWriter)
  • 0Как заполнить вид сетки данными из базы данных MySQL? (C # UWP)
  • 1Калитка 6 Установите флажок CheckGroup по умолчанию не отмечен
  • 0Должность: Абсолют; Div делает страницу слишком широкой и добавляет пустое пространство сбоку. Как мне уменьшить его размер?
using System;
 
class Program
{
    static void Main(string[] args)
    {
        int[,] a = { { 1, 1, 1, 1, 1 }, 
                   { 1, 1, 1, 1, 1 },
                   { 1, 1, 1, 1, 1 } };
        Console.WriteLine("Size = [{0}, {1}]", a.GetLength(0), a.GetLength(1));
    }
}

Старый

22.04.2010, 13:30

Кандидат Javascript-наук

Отправить личное сообщение для bayah

Посмотреть профиль

Найти все сообщения от bayah

 

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

Сообщений: 111

Как найти индекс по элементу в двумерном массиве?

Еще вопрос, товарищи, как определить индекс по элементу в двумерном массиве. Например так:

a = new Array()
a[0] = new Array(1, 2)
a[1] = new Array(2, 3)
...

Теперь как мне найти индекс массива с элементом (2, 3). indexOf я так понимаю не поможет здесь?

Ответить с цитированием

Старый

22.04.2010, 13:32

Аватар для Skipp

.

Отправить личное сообщение для Skipp

Посмотреть профиль

Найти все сообщения от Skipp

 

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

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

a[1][0] and a[1][1]

__________________
.

Ответить с цитированием

Старый

22.04.2010, 13:58

Кандидат Javascript-наук

Отправить личное сообщение для bayah

Посмотреть профиль

Найти все сообщения от bayah

 

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

Сообщений: 111

Это понятно. Дело в том что мне нужно найти пару a[1][0] a[1][1], сразу.

Ответить с цитированием

Старый

22.04.2010, 14:27

Аватар для Nekromancer

Профессор

Отправить личное сообщение для Nekromancer

Посмотреть профиль

Найти все сообщения от Nekromancer

 

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

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

так чтоле …

for (var i = 0, len = a.length; a<len; i++){
a[i].indexOf('...');
}

a[i] массив, делай дальше с ним, что хочешь

__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.

Ответить с цитированием

Старый

22.04.2010, 15:01

Отправить личное сообщение для Octane

Посмотреть профиль

Найти все сообщения от Octane

 

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

Сообщений: 3,873

Наверное, ТС хочет сделать так:

a.indexOf([2, 3])

Но такой вариант не будет работать, поэтому придется перебирать все массивы в цикле.

Ответить с цитированием

Старый

22.04.2010, 15:26

Кандидат Javascript-наук

Отправить личное сообщение для bayah

Посмотреть профиль

Найти все сообщения от bayah

 

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

Сообщений: 111

Наверное, ТС хочет сделать так:

a.indexOf([2, 3])

.

Да, так мне и нужно было и так не работает. Но я думаю он имел ввиду так:

a[i].indexOf(2)
потом
a[i].indexOf(3)

а i гонять по циклу
если оба найдены, искомый индекс = i

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

Ответить с цитированием

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти ответы на класс проверочные работы
  • Как найти чип в автомобиле
  • Как выпускнику найти работу после вуза
  • Как найти периметр квадрата если стороны 8см
  • Частота моды алгебра как найти

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии