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 つ少ない場合は、カンマを「大括弧」で囲み、最も外側のレベルの要素を分離します。(-1 は、最初の文字から次の最後の文字までの部分文字列を取得することによってきちんと達成されることに注意してください。) 適切な量の右中括弧と左中括弧を後方参照および前方参照として使用すると、初期化子が最も外側のレベルの初期化に分割されます。 . インデックスの配列から最初のインデックスを使用して正しいものを選択し、このサブ初期化子と縮小されたインデックスのセットで繰り返すか、int 要素を選択する必要がある最後のインデックスで停止します。

于 2016-03-20T17:56:58.747 に答える