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 

那么对于任何给定的任意大小和任意数量的维度数组初始化器,我将如何做到这一点?

4

2 回答 2

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

该代码基于观察到的初始{{{...{和尾随}}}...}反映了维数。少一个大括号在两边“括号”逗号,分隔最外层的元素。(注意,-1 是通过从第一个字符到下一个但最后一个字符的子字符串巧妙地实现的。)使用正确数量的右大括号和左大括号作为后视和前瞻将初始化程序拆分为最外层的初始化. 使用索引数组中的第一个索引来选择正确的索引,并使用这个子初始化器和一组减少的索引重复,或者停止必须选择 int 元素的最后一个索引。

于 2016-03-20T17:56:58.747 回答
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数组(不带s )转换为null具有相同“形状”但具有条目 1、2、3... .array[1][1][3]arraypositions[1][1][3]

于 2016-03-20T17:42:37.117 回答