2014-12-07 6 views
0

Предположим, если у меня есть матрица 4x4 массив какКак получить часть массива 2d?

aaaa 
abba 
abba 
aaaa 

Могу ли я получить матрицу 3х3 из приведенной выше матрицы и хранить его в другом 2d массива. Матрица 3х3 должна содержать элементы

aaa 
abb 
abb 

аналогично

aaa 
bba 
bba 

и больше двух матриц.

Это можно сделать с помощью массивов Array.copyOfRange?

EDIT: Мне также нужны другие 2 3x3 матрицы, т.е.

abb 
abb 
aaa 

и

bba 
bba 
aaa 

Как, если я перехожу элементы в матрице 2х2, которая в 4x4, т.е.. b, он должен дать мне матрицу 3x3, окружающую элемент.

Я могу это сделать, используя цикл for, который принимает значения i и j из вычитания 1 из индекса элемента (здесь 'b'), который я передаю, что приводит к матрице 3x3, значение b (см. выше). Но просто хочу знать, есть ли более простой способ.

+1

Возможно, вы могли бы сначала (а) прочитать документацию: https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOfRange(byte[],%20int,% 20int), (б) Попробуйте. Если это не сработает для вас, отправьте код, который вы пробовали, с вашей конкретной проблемой. – EJK

+0

Да, я видел документацию. Но я мог бы найти, что copyofrange может получать данные из одномерного массива. Я хочу знать, как это можно сделать для 2d-массива. Я могу использовать центр 2x2 в матрице 4x4 и получить элементы, окружающие каждый элемент 2x2, чтобы получить требуемый массив 3x3, использующий для циклов. Просто хотел знать, есть ли простой способ. – v1shnu

+0

Если вы добавили дополнительную информацию о том, что вы собираетесь делать с этими суб-массивами, можно дать дополнительные подсказки. Например, вы можете рассмотреть 'интерфейс Array2D {...}', который имеет метод 'Array2D getSubArray (...)', который возвращает только * вид * в подматрица. Здесь возможно множество решений, и некоторые из них могут быть более элегантными, чем копирование, в зависимости от случая приложения. – Marco13

ответ

0

Я хотел бы использовать System.lang.arrayCopy:

import java.util.Arrays; 

public class ArrayRange { 

    public static void main(String[] args) { 

     char[][] original = createMatrix(4); 

     // copy 3x3 array starting at 1,0 
     char[][] subArray = copySubrange(original, 1, 0, 3, 3); 

     printArray(original); 
     printArray(subArray); 
    } 

    private static char[][] copySubrange(char[][] source, int x, int y, int width, int height) { 
     if (source == null) { 
      return null; 
     } 
     if (source.length == 0) { 
      return new char[0][0]; 
     } 
     if (height < 0) { 
      throw new IllegalArgumentException("height must be positive"); 
     } 
     if (width < 0) { 
      throw new IllegalArgumentException("width must be positive"); 
     } 
     if ((y + height) > source.length) { 
      throw new IllegalArgumentException("subrange too high"); 
     } 
     char[][] dest = new char[height][width]; 
     for (int destY = 0; destY < height; destY++) { 
      char[] srcRow = source[(y + destY)]; 
      if ((x + width) > srcRow.length) { 
       throw new IllegalArgumentException("subrange too wide"); 
      } 
      System.arraycopy(srcRow, x, dest[destY], 0, width); 
     } 
     return dest; 
    } 

    // Set up a matrix as an array of rows. 
    // The y-coordinate is the position of a row in the array. 
    // The x-coordinate is the position of an element in a row. 
    private static char[][] createMatrix(int size) { 
     char[][] original = new char[size][size]; 
     for (int y = 0; y < original.length; y++) { 
      for (int x = 0; x < original[0].length; x++) { 
       original[y][x] = (char) (Math.random() * 10 + 48); 
      } 
     } 
     return original; 
    } 

    private static void printArray(char[][] array) { 
     for (int y = 0; y < array.length; y++) { 
      System.out.println(Arrays.toString(array[y])); 
     } 
     System.out.println(); 
    } 
} 

Пример вывода:

[0, 7, 4, 3] 
[9, 2, 7, 2] 
[9, 2, 4, 0] 
[9, 1, 5, 9] 

[7, 4, 3] 
[2, 7, 2] 
[2, 4, 0] 

EDIT: улучшенный код с проверками диапазона.

+0

да! это то, что мне нужно. Спасибо alot :) Проверки диапазона, которые вы упомянули, должны избегать получения исключения из пределов границы справа? – v1shnu

+0

Правильно, и вы можете проверить, чтобы избежать npe's –