2016-03-20 10 views
0

Так что я хочу, чтобы положение каждого элемента в пределах инициализатора массива, например:Положение каждого элемента инициализатора массива

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

как бы я быть в состоянии получить положение каждого из элемент в части

{{{1,2},{3,4}},{{5,6},{7,8}}} 

так, например:

testArray[0][0][0] gives -> the element 1 

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

+3

Не должно быть слишком сложно с рекурсией. Зачем вам это нужно? –

+0

по положению вы имеете в виду индекс? –

+0

@YassinHajaj Я думаю, что требуется (что-то вроде) метод с сигнатурой 'int foo (Object arr, int ... indices)', который принимает многомерный массив int (неизвестной глубины) и последовательность индексов и возвращает положение соответствующего 'int' в инициализаторе массива для' arr'. Это довольно интересный вопрос, но OP придется заплатить мне плату, прежде чем я напишу! –

ответ

0

Попробуйте это

public static Object sequential(Object o) { 
    return sequential(o, new int[] {1}); 
} 

private static Object sequential(Object o, int[] start) { 
    if (o instanceof int[]) { 
     int[] arr = (int[]) o; 
     int length = arr.length; 
     int[] copy = new int[length]; 
     for (int i = 0; i < length; i++) 
      copy[i] = start[0]++; 
     return copy; 
    } 
    Object[] arr = (Object[]) o; 
    int length = arr.length; 
    Object[] copy = arr.clone(); 
    for (int i = 0; i < length; i++) 
     copy[i] = sequential(arr[i], start); 
    return copy; 
} 

public static void main(String[] args) { 
    int[][][] array = {{{10, 9}, {1, 2, 3}}, {{1, 2}, {7, 8, 1, 1, 1, 1}, {}, {1}}}; 
    int[][][] positions = (int[][][]) sequential(array); 
    System.out.println(Arrays.deepToString(positions)); 
} 

Эта программа выходов

[[[1, 2], [3, 4, 5]], [[6, 7], [8, 9, 10, 11, 12, 13], [], [14]]]. 

Метод sequential преобразует любой многомерный int массив (без null S) в массив той же "формы", но с элементами 1, 2, 3 ... Поэтому, если вы хотите знать положение, например, array[1][1][3] в инициализаторе массива для array, вы можете просто сделать positions[1][1][3].

0

В качестве альтернативы, рассмотреть этот способ обработки строк:

static final Pattern pat = Pattern.compile("(\\{*).*?(\\}*)"); 
static final String init= "{{{1,2},{3,4}},{{5,6},{7,8}}}"; 
static String unwrap(String s, int... index){ 
    String inner = s.substring(1, s.length()-1); 
    Matcher mat = pat.matcher(inner); 
    if(mat.matches()){ 
     String splitter = 
      "(?<=" + Pattern.quote(mat.group(2)) + 
      "),(?=" + Pattern.quote(mat.group(1)) + ")"; 
     String[] elems = inner.split(splitter); 
     if(index.length == 1){ 
      return elems[index[0]]; 
     } else { 
      return unwrap(elems[index[0]], 
          Arrays.copyOfRange(index, 1, index.length)); 
     } 
    } 
    throw new IllegalStateException("Inconsistent data"); 
} 

Код основан на наблюдении, что начальная {{{...{ и задняя }}}...} отражают число измерений. Одна скобка меньше, с обеих сторон «скобка» запятая, разделяющая элементы самого внешнего уровня. (Обратите внимание, что -1 выполняется аккуратно, взяв подстроку от первого до следующего, но последнего символа.) Используя правильное количество закрывающих и открывающих фигурных скобок в качестве внешнего вида и взгляда вперед, разделяет инициализатор на инициализацию самого внешнего уровня , Используйте первый индекс из массива индексов, чтобы выбрать правильный, и повторите с этим под-инициализатором и уменьшенным набором индексов или остановитесь для последнего индекса, который должен выбрать элемент int.

+0

привет, извините, вы могли бы просто объяснить свой код немного не слишком уверенным в этом? или, может быть, только поздно, но не могли бы вы немного объяснить? –

+0

@AlanLiang Я добавил несколько объяснений в свой ответ. – laune

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

  • Нет связанных вопросов^_^