web-dev-qa-db-ja.com

Java 3D配列は値を割り当てます

このような配列があります

static String[][][] School= new String[1000][20][5]; 
  • 最初の括弧にクラス名を保存します
  • 2番目に、学生のIDを保存します
  • 3番目では、学生に関する情報(氏名、姓など)を保存します。

最初にすべてのクラス名を割り当て、その後、すべてのクラスに学生IDを割り当て、次にそれらの情報を入力します。

どうすればできますか?私は例えばでそれを試しました

School[i] = "A1";

しかし、それは機能していません。

編集:これを3つすべて保存する他の方法はありますか? (クラス名、学生とその情報)

6
user3549340
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レコードがあるので。

配列には次のような要素があります

enter image description here

[〜#〜]注記[〜#〜]この目的で3D配列を使用することはお勧めしません。

Suggestion3つのStringsでクラスを宣言し、この3つのパラメーターを使用してコンストラクターを作成し、Objects

17
CoderCroc

3D配列を使用する代わりに、学生のすべての情報を保持するStudentクラスと、クラスの学生のリストを保持するSchoolClassのクラスを作成することをお勧めしますクラスの名前とArray of SchoolClass目的を果たす。

これにより、より適切に管理できるようになります。

お役に立てれば

3
Sanjeev

まず第一に、可変フィールドは通常、慣例によりキャメルテキストで小文字で始まります。

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()]);
}
0
Unihedron

あなたの配列はあなたが期待することをしません。

配列は、各要素が点である3D配列のように考えてください。単一のインデックスを指定する場合は、基本的にコンピューターに「OK、"A1"配列のこのスライスに割り当てます(例では、String[][] elementAtI = "A1";のようなものを実行しようとしています」 )今では意味がありませんね。

配列内の単一の要素を取得するには、3D空間で点を見つけるために3つの座標すべてを指定する必要があるのと同様に、3つのインデックスすべてを指定する必要があります。

School[3][4][5] = "A1";

3D配列よりも優れているのはオブジェクトです。すべてを配列にパックすることはできますが、SchoolClass[]を使用する場合ほど読みやすくはありません。各SchoolClassにはnameStudentsの配列があり、各StudentにはIDnameなどがあります。

0
awksp