可能であれば、次元ごとに異なるプリミティブデータ型を使用してJavaで静的多次元配列を作成するにはどうすればよいですか?
静的とは、ArrayListのように動的ではないプリミティブ配列を意味します。
可能であれば、次元ごとに異なるプリミティブデータ型を使用してJavaで静的多次元配列を作成するにはどうすればよいですか?
静的とは、ArrayListのように動的ではないプリミティブ配列を意味します。
できません。
多次元配列は、定義上、配列の配列の配列です....何かの。したがって、最後の次元を除いて、これらの次元を配列以外にする方法はありません。少なくとも、とにかく伝統的な定義によって。しかし、「多次元配列」とは何か別のものを意味する場合は、それが何であるかを教えていただく必要があります。
「静的」に関しては、それはプログラミングで非常に過負荷な言葉であり、私が考えることができるすべての言語は、それを少し異なる意味で使用しています。Java では、static
「クラスのインスタンスではなく、そのクラスに属する」ことを意味します。繰り返しますが、ここで「静的」という言葉が別の意味である場合は、それが何であるかをお知らせください。
編集:最初に投稿されたように、質問には「プリミティブ」という言葉が含まれていませんでした。それはそれを少し変えます。char
実際、Javaenum
が単にint
. しかし、そうではありません。
配列の次元は常にint型からのものです。考えてみてください!
int a = 4;
int b = 5;
Shoe shoe = new Shoe (Color.RED, 42, "Leather");
Hat hat = new Hat (17, Color.Black);
Foo foo = foos[a][b];
Zilch pop = bars[shoe][hat]; // no go
Foosの多次元配列がある場合、最初の次元はFoo、2番目はFoosの配列、3番目はFooの配列の配列です。唯一の変数タイプは下部にあるものです。
配列は静的またはプリミティブとは呼ばれません。それらのサイズは初期化時に固定され、プリミティブと共通しているのは、それらがビルトインであるということです。これは、場合によっては特別な脅威にさらされます。それらは、いわゆるプリミティブ型とは対照的です。いわゆるプリミティブ型は、そのプリミティブではありませんが(たとえば、のように、独自の演算子のみを持って* / -
います)、オブジェクトですが、ライブラリで宣言されていません。
それらを呼び出しますbuild in-types
。
Bhesh Gurungのトリックを使用する:
Object[] arr = {new Integer[]{}, new String[]{}, new Double[]{}};
は問題を懇願しており、ディメンションごとに異なるデータ型で構成されていません。寸法から始めましょう:
// One-dimensional object:
JPanel [] panels = new JPanel [3];
// Two-dimensional object:
JPanel [][] panels = new JPanel [3][10];
最下層にJPanelがあり、次の次元にJPanelの配列があります。さらにディメンションを追加することができ、常に追加の(...の配列)がラップアラウンドされます。
intとchar、JPanelとJFrame、intとJButtonなどの異なるデータ型を配列に混在させることはできません。違いを抽象化し、JPanelとJFrameのJComponentを共通の親として使用する場合のみですが、組み込み型のint、char、booleanなどはオブジェクトではないため、これは機能しません。
しかし、オートボクシングを使用して、intの代わりにIntegerを使用し、charの代わりにCharacterを使用してから、共通の親クラスとしてObjectを使用することはできませんか?はい、できますが、プリミティブを使用しなくなったため、問題が発生しました。
ダンは別のことについて話しています-多次元配列のインデックス付けに異なるタイプを使用しています:
byte b = 120;
short s = 1000;
String o [][] = new String[b][s];
b = 7;
s = 9;
o[b][s] = "foobar";
String foo = o[b][s];
バイトまたはショートを使用しても問題はありませんが、バイトまたはショートとして宣言して配列のサイズを制限することはできません。ほとんどの場合、組み込み整数型の境界はデータ型に適合しません(1年あたり365日と考えてください)。特に、すべての型が負になる可能性があるため、境界チェックが必要ですが、コンパイルに制限することはできません。時間。
しかし、ここで問題になります。
配列を最初から2次元として宣言できます。
Object[][] ar2 = {
new Integer [] {4, 5, 6},
new String [] {"me", "and", "you"},
new Character [] {'x', 'y', 'z'}};
これは正常に機能し、キャストせずに内部配列にすぐにアクセスできるようになります。ただし、要素がオブジェクト配列であることがコンパイラでのみ知られています。基になる型は抽象化されているため、次のように記述できます。
ar2[1][1] = 17; // expected: String
ar2[2][0] = "double you"; // expected: Char
これは完璧にコンパイルされますが、あなたは自分の足を撃ち、ランタイム例外を無料で取得します。
全体としてのソースは次のとおりです。
public class ArrOfMixedArr
{
public static void main (String args[])
{
Object[] arr = {
new Integer [] {1, 2, 3},
new String [] {"you", "and", "me"},
new Character [] {'a', 'b', 'c'}};
show (arr);
byte b = 7;
short s = 9;
String o [][] = new String[200][1000];
o[b][s] = "foobar";
String foo = o[b][s];
Object[][] ar2 = {
new Integer [] {4, 5, 6},
new String [] {"me", "and", "you"},
new Character [] {'x', 'y', 'z'}};
show (ar2);
// exeptions:
ar2[1][1] = 17; // expected: String
ar2[2][0] = "double you"; // expected: Char
}
public static void show (Object[] arr)
{
for (Object o : arr)
{
if (o instanceof Object[])
show ((Object[]) o);
else
System.out.print (o.toString () + "\t");
}
System.out.println ();
}
}
今、解決策は何ですか?(int、byte、char、String、JPanel、...)の基本型配列が同じ長さである場合、非表示のオブジェクト、データベース行のようなものがあります。代わりにクラスを使用してください。
class Shoe {
byte size;
String manufactor;
java.math.BigDecimal price;
java.awt.Color color;
}
Shoe [] shoes = new Shoe [7];
同じサイズの異なるタイプがない場合、それらは無関係である可能性があり、共通のコンテナーに入れるべきではありません。
いくつかのテストの後、簡単な解決策があります。
Object [][] array = new Object [10][2];
array[0][0] = 2;
array[0][1] = false;
オブジェクトの配列 (ディメンションと同じ数のレベルでネスト) の配列の配列を定義し、最下層で各配列を異なる型で埋めることができます...そして、抽出する必要がある場合適切な型にキャストします。本当に、価値のあるものに対して仕事が多すぎます。Java は静的型付け言語であるため、この種のことには向いていません。
なぜそのようなデータ構造が必要なのか、再考する必要があるかもしれません。