1

次のメソッド シグネチャがあるとします。

int f (int[] values)

そして私はそれを次のように呼びます:

int[] myValues = {1,2,3,4,5}
f (myvalues)

次に、配列はオブジェクトであり、オブジェクトは参照型であるため、f はint への参照を受け取り、呼び出し元が変更を確認できるように値を変更できます。

f次に、コピーせずに配列要素 2,3,4 (つまり、インデックス 1 から 3 までのサブレンジ) への参照を受け取るように呼び出すにはどうすればよいmyValuesでしょうか? 何かのようなもの

f ((int[]) myvalues[1])

もちろん、これはコンパイルされません (そして、配列のサイズが開いたままになります) が、私が探しているアイデアを転送する可能性がありますか?

他の言語では、ポインター演算を使用して のアドレスを計算し、myValues[2]それを整数の配列の先頭として扱い、明示的なカウント パラメーターを渡すことができます。(もちろん、タイプセーフではありません。)

3 つの要素の値を中間配列にコピーせずに Java でこれを行うことはできますか?

サブ質問:配列要素は値型であり、連続したアドレスに格納されていますか、それとも配列は整数への参照である要素で構成されていますか? 後者への答えが「はい」だったとしても、それはJavaソースがそれに基づいて構築してはならない実装の詳細であるため、それを構築することができなかったので、質問は意味をなさないのでしょうか? できません。セマンティクスはありませんよね?

編集:愚かなインデックスエラー

4

3 に答える 3

2

List配列の代わりに使用できます。

int[] myValues = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> myValuesList = Arrays.asList(myValues);

// change the argument of function to List
doSomething(List<Integer> input);

// and then just give the function a range of the myValues.
// This List is still backed by your array myValues, it just
// a view of the original array.
doSomething(myValuesList.subList(2,3));
于 2012-06-18T07:59:18.840 に答える
1

コンテナーの新しいインスタンスを作成せずに、配列 (コレクションも) 内の項目の範囲/サブセットを返すことはできません。

推測せずに2番目に答えることはできませんが、 JVMが1つの配列に2つのメモリ領域を割り当てたい場合、知らないうちにそれを行うことができます.

于 2012-06-18T07:56:39.857 に答える
0

C/C++ では、これは少しのポインター演算で非常に簡単に実行できますが、Java ではそれが可能かどうかはわかりません。

あなたができる最善の方法は、 copyOfRangeメソッドを使用することですが、それはディープ コピーを作成します。

于 2012-06-18T08:00:01.667 に答える