Java 3D数组赋值

时间:2014-05-13 12:00:49

标签: java arrays 3d

我有一个看起来像这样的数组

static String[][][] School= new String[1000][20][5]; 
  • 在第一个括号中,我保存了班级名称
  • 在第二个我保存学生的身份证件
  • 在第三部分,我保存了有关学生的信息(他的姓名,姓氏等)。

首先我分配所有的班级名称,之后我将每个班级分配给学生证,然后我可以填写他们的信息。

我该怎么办?我试过它,例如

School[i] = "A1";

但它不起作用。

编辑:或者还有另外一种方法可以保存这三件事吗? (班级名称,学生及其信息)

4 个答案:

答案 0 :(得分:17)

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阵列用于此目的。

建议使用这三个参数声明一个包含三个Strings创建构造函数的类,并通过Objects

答案 1 :(得分:3)

我建议您不要使用3D数组,而应创建一个Student类,其中包含学生的所有信息以及SchoolClass的A类,其中包含学生列表类的类和名称,您可以保持Array of SchoolClass以达到目的。

通过这种方式,您可以更好地管理它。

希望这有帮助

答案 2 :(得分:0)

您的阵列无法按照您的预期执行操作。

将数组视为3D数组,每个元素都是一个点。如果您指定一个索引,那么您实际上是在告诉计算机“好的,我想将"A1"分配给这个数组的片段(在您的示例中,您正在尝试做类似于String[][] elementAtI = "A1";的东西。现在这没有意义,是吗?

要获取数组中的单个元素,您必须指定所有三个索引,就像在3D空间中指定所有三个坐标来定位点一样:

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

比3D阵列更好的想法是对象。将所有内容打包到数组中是有效的,但这不像有SchoolClass[]那样可读,其中每个SchoolClass都有name和数组Students,每个{{1}有} StudentID

答案 3 :(得分:0)

首先,变量字段通常按照惯例以驼峰文本小写开头。

static String[][][] school= new String[1000][20][5];

其次,数组不能像这样工作。 String [] [] []持有{{{entry ...} entry ...}条目...}。 这些条目可能包含重复项,这使得它成为一种不可行的方法,因为您将在同一个数组中获得{"3A", "1", "PersonName"}{"3A", "1", "DifferentPersonName"}。每个数组维度都包含额外的维度 {"3A", {"1", {"PersonName"}, {"DifferentPersonName"}}},所以

School[i] = "A1";是语法错误,因为你必须将String [] []放在String [i] [] []中:

School[i] = {{"A1","PersonName"}};

我相信这里的解决方案是使用HashMaps。重复的条目将相互覆盖。在这种情况下,代码将是:

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