所以我想获取数组初始化器中每个元素的位置,例如:
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
那么我将如何为任何给定的任意大小和任意数量的维度数组初始化器执行此操作呢?
试试这个
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]
。
作为替代方法,请考虑以下字符串处理方法:
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 元素的索引。