2014-02-09 3 views
2

Недавно мы изучили двумерные массивы и решили задачу вычисления среднего числа всех элементов в нем. Мой код был как:Общее количество элементов в двумерной матрице

int a[][] = { 
    {1, 2, 3, 4, 5}, 
    {6, 4, 2, 7}, 
    {3, 6}, 
    {2, 6, 8}, 
}; 

int sum=0, amount=0; 
for (int[] row : a) 
    for (int val : row) { 
    sum += val; amount += 1; 
    } 

return sum/(double) amount; 

Дело в том, что мне не нравится, как я вычислил количество элементов в массиве. Я попытался использовать размер(), он не работал, пытался использовать классы Array и Arrays, но оба могут извлекать ни количество строк, ни количество элементов в некоторой строке, как свойство .length.

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

+0

Поскольку каждый массив в первом массиве может иметь разные размеры, я думаю, вам нужен цикл здесь. – ThePerson

+0

Я думаю, что код очень лаконичен. –

+0

Думал, может, я что-то пропустил во время обучения. – aka

ответ

2

Нет, для этого нет родной Java-функции, поскольку массив массивов (массивов (массивов ...)) не является языковой конструкцией как таковой. Массив, но массив массивов - это всего лишь массив объектов (которые снова могут, но не обязательно должны быть массивами). Обозначение Object[][] просто обеспечивает безопасность типов для многомерных массивов.

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


общее решение, где производительность не является проблемой, которая подсчитывает все элементы без массива для произвольных одномерных массивов с использованием рекурсии и java.lang.reflect.Array может выглядеть примерно так:

public static int size(Object object) { 
    if (!object.getClass().isArray()) { 
     return 1; 
    } 

    int size = 0; 
    for (int i = 0; i < Array.getLength(object); i++) { 
     size += size(Array.get(object, i)); 
    } 
    return size; 
} 

Вы можете назвать это функция с любым объектом:

int[][] matrix = { 
    { 1, 2, 3 }, 
    { 4, 5, 6 }, 
    { 7, 8, 9 } 
}; 


Object[] array = { 
    "1", 
    new String[]{ 
     "2", "3", "4" 
    }, 
    new int[][] { 
     { 5 }, 
     { 6, 7 }, 
     { 8, 9, 10 } 
    } 
}; 


String literal = "literal"; 

System.out.println(size(matrix)); 
System.out.println(size(array)); 
System.out.println(size(literal)); 

бы тогда выход

9 
10 
1 

Это не очень элегантное решение, но, как polygenelubricants выразился:

Это будет очень повторяющиеся (но даже java.util.Arrays очень повторяющаяся), но это так, как это в Java с массивами.

+0

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

1

Nope. В Java нет понятия о двухмерном массиве (на C# есть) - то, что у вас есть, есть массив массивов. И так как каждый «внутренний» массив может иметь разную длину, с петлей это сложно обойти.

Является ли цикл действительно проблемой, или вы просто ищете более «встроенное» решение?

+0

Да, я смотрел на любое встроенное решение. Но не нашел ... – aka

Смежные вопросы