数组初始值设定项的每个元素的位置

时间:2016-03-20 17:05:41

标签: java arrays multidimensional-array array-initialization

所以我想得到数组初始化器中每个元素的位置,例如:

 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 

那么我如何为任何给定的任意大小和任意数量的维数组初始化器做这个呢?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

作为替代方案,请考虑此String处理方法:

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" );
}

该代码基于以下观察:初始{{{...{和尾随}}}...}反映了维度的数量。两侧少一个支架&#34;支架&#34;逗号,分隔最外层的元素。 (注意,通过从第一个到下一个但最后一个字符获取子字符串可以很好地实现-1。)使用正确数量的结束和打开括号作为后面的外观和前瞻将初始化器拆分为最外层的初始化。使用索引数组中的第一个索引来选择正确的索引,并使用此子初始化程序和一组精简索引重复,或者停止最后一个必须选择int元素的索引。