このような配列があります
static String[][][] School= new String[1000][20][5];
最初にすべてのクラス名を割り当て、その後、すべてのクラスに学生IDを割り当て、次にそれらの情報を入力します。
どうすればできますか?私は例えばでそれを試しました
School[i] = "A1";
しかし、それは機能していません。
編集:これを3つすべて保存する他の方法はありますか? (クラス名、学生とその情報)
static String[][][] School= new String[1000][20][5];
3次元の図を考えてみましょう。
したがって、School[0][0][0]="A1"
を挿入すると、0,0,0の位置に要素を入力したことになります。
これは0,0,0から1000,20,5の位置まで移動します。
このように挿入できますが、要素が多すぎます。
School[0][0][0]="A1"
School[0][0][1]="A2"
School[0][0][2]="A3"
.....
School[0][1][0]="B1"
School[0][1][1]="B2"
School[0][1][2]="B3"
......
3D配列の要素は次のようになります
int[3][4][2] array3D
// means Three (4x2) 2 Dimensional Arrays
int[4][2]
//means Four 1 dimensional arrays.
次に、3D配列に要素を追加する方法
開始時に直接使用できます
int[][][] threeDArray =
{ { {1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} },
{ {10, 11, 12}, {13, 14, 15}, {16, 17, 18} },
{ {19, 20, 21}, {22, 23, 24}, {25, 26, 27} } };
すべての位置に詳細を挿入したい場合、これはあなたのケースでは非常に退屈な作業です。 1000
レコードがあるので。
配列には次のような要素があります
[〜#〜]注記[〜#〜]:この目的で3D配列を使用することはお勧めしません。
Suggestion:3つのStrings
でクラスを宣言し、この3つのパラメーターを使用してコンストラクターを作成し、Objects
3D配列を使用する代わりに、学生のすべての情報を保持するStudent
クラスと、クラスの学生のリストを保持するSchoolClass
のクラスを作成することをお勧めしますクラスの名前とArray of SchoolClass
目的を果たす。
これにより、より適切に管理できるようになります。
お役に立てれば
まず第一に、可変フィールドは通常、慣例によりキャメルテキストで小文字で始まります。
static String[][][] school= new String[1000][20][5];
次に、配列はこのように機能しません。 String [] [] []は{{{entry ...} entry ...} entry ...}を保持します。エントリには重複が含まれている可能性があり、同じ配列内で{"3A", "1", "PersonName"}
と{"3A", "1", "DifferentPersonName"}
を取得するため、これは実行不可能な方法になります。各配列の次元は追加の次元、別名{"3A", {"1", {"PersonName"}, {"DifferentPersonName"}}}
を保持しているため、
School[i] = "A1";
は、String [] []をString [i] [] []に配置する必要があるため、構文エラーです。
School[i] = {{"A1","PersonName"}};
ここでの解決策はHashMapを使用することだと思います。繰り返されるエントリは互いに上書きします。この場合、コードは次のようになります。
// The actual HashMap!
static final HashMap<String, HashMap<String, String>> school
=new HashMap<String, HashMap<String, String>>();
/**
* How to use an entry using the above HashSet:
*
* @param className The name of the class.
* @param id The id.
* @param details The details.
*/
void addEntry(final String className, final String id, final String details){
HashMap<String, String>value=school.get(className);
// If the class already exists, use it, otherwise make new HashMap.
(value==null ? value = new HashMap<String, String>() : value)
// Here is how to put in the value mapping.
.put(id, details);
// Put it back in. This updates the entry.
school.put(value);
}
/**
* How to get (iterate through) entries from the above HashSet:
*
* @return An array of students in format "class id details"
*/
String[] getStudentsSet(){
// This is an iterator.
Iterator<Entry<String, HashMap<String, String>>>iterator=
school.entrySet().iterator();
Entry<String, HashMap<String, String>>next;
String now;
// This is for testing
final ArrayList<String>list=new ArrayList<String>();
while(iterator.hasNext()){
// Load new class name
now=(next=iterator.next()).getKey();
Iterator<Entry<String, String>>iteratorlv2=next.entrySet().iterator();
while(iterator.hasNext()){
final Entry<String, String>entry=iterator.next();
/* This is the student from class "now", id "entry.getKey()", and details "entry.getValue()"
* Change this line to what you want, or what you would like to use entries for.
*/
final String student=now+" "+entry.getKey()+" "+entry.getValue();
// This is for testing
list.add(student);
}
}
// This is what prints to the console so you know this thing works.
for(final String o:list) System.out.println(o);
return list.toArray(new String[list.size()]);
}
あなたの配列はあなたが期待することをしません。
配列は、各要素が点である3D配列のように考えてください。単一のインデックスを指定する場合は、基本的にコンピューターに「OK、"A1"
を配列のこのスライスに割り当てます(例では、String[][] elementAtI = "A1";
のようなものを実行しようとしています」 )今では意味がありませんね。
配列内の単一の要素を取得するには、3D空間で点を見つけるために3つの座標すべてを指定する必要があるのと同様に、3つのインデックスすべてを指定する必要があります。
School[3][4][5] = "A1";
3D配列よりも優れているのはオブジェクトです。すべてを配列にパックすることはできますが、SchoolClass[]
を使用する場合ほど読みやすくはありません。各SchoolClass
にはname
とStudents
の配列があり、各Student
にはID
、name
などがあります。