如何并排打印两个2D阵列?

时间:2014-05-03 23:40:38

标签: java arrays swing user-interface

因此,用户在不同的字段中输入他/她的姓名。 (必须那样)

参考图片:enter image description here

我要做的是在4个测试标记旁边显示他们的名字。

所以它看起来像这样

John Smith 55.0 100.0 23.0 50。 Jane Smith 100.0 50.0 76.0 22.0 等等。

我的代码是

public class StudentGradesView extends FrameView {
    final static int students=15;
    final static int numOfTest=4;
    final static int firstNLast=2;

    //Start with the first student in the 2D array
    private int row = 0;


    //DELCARING THE 2D ARRAY
    double[][] marks = new double[students][numOfTest];
    String[][] names = new String[students][firstNLast];

    //1D Arrays
    double testScores[]=new double[4];
    String studentNames[]=new String[2];


    public void addInfo(){
        studentNames[0]= firstNameIn.getText();
        studentNames[1]= lastNameIn.getText();

        testScores[0]=Double.parseDouble(testOneIn.getText());
        testScores[1]=Double.parseDouble(testTwoIn.getText());
        testScores[2]=Double.parseDouble(testThreeIn.getText());
        testScores[3]=Double.parseDouble(testFourIn.getText());

        //Add first and last name to 2d array
        for(int col=0;col <studentNames.length; col++){
            names[row][col]= studentNames[col];
        }

        //Add all four test scores to the current student
        for(int col=0;col < testScores.length; col++){
            marks[row][col]= testScores[col];
        }
        //Advance to the next student
        row++;
    }

    public void displayArray(){
        for(int i=0;i<names.length;i++){
            for(int j=0; j<firstNLast;j++){
                finalOutput.append(names[i][j]+" ");
            }
            finalOutput.append("\n");
        }

        for(int i=0; i<marks.length;i++){
            for(int j=0; j <numOfTest; j++){
                finalOutput.append(marks[i][j]+" ");
            }
            finalOutput.append("\n");
        }
    }
}

当我点击列表/ displayArray()时,我最终得到了什么;这是: Shows the names separately from the numbers.

Like this here

所以我被困在如何让它们在彼此旁边打印。还有一种方法可以只打印用户输入的条目数量吗?如果一个用户输入了一组信息,只打印一行?

感谢。

3 个答案:

答案 0 :(得分:3)

在你的displayArray方法中,我首先通过调用finalOutput.setText("")清除JTextArea,然后在for循环中从0到行 - 到目前为止已添加的学生数。否则,您将循环遍历整个数组,该数组将在行索引之上具有所有空值。

更好 - 不要使用数组,而是使用数组列表。

更好的是:创建一个学生班,其中包含一个学生的姓名和成绩,并使用一个ArrayList<Student>

更好的是 - 在JTable中显示上面的数据。

答案 1 :(得分:2)

因为这显然是一个学习练习,我不打算给你代码。

快速而肮脏的答案是将您的显示代码更改为以下内容:

public void displayArray(){
    for (int i = 0; i < names.length; i++) {
        if (/* some test to check that the entry is populated */) {
            // append the names for student i
            // append the scores for student i 
            // append newline 
        }
    }
}

我会留给你填写详细信息。


但这里真正的问题是你犯了很多设计错误。

  1. 将名称和分数存储为数组数组是一个坏主意。 Java提供了更易于使用的List类型,并且没有固定的长度。

    • 每名学生不需要有固定数量的分数。

    • 每个学生不需要固定数量的名字。

    • 您不需要有固定数量的学生。

  2. 您应该创建一个代表每个学生的班级。它可能非常简单,只包含名称和分数列表的getter和setter,或者您可以尝试封装状态......

  3. 为学生创建课程后,您可以使用JList(或JTable)来显示List<Student>。显示屏看起来更漂亮,您不需要“列表”按钮。

  4. (现在有可能,这些事情将由你的讲师解决......而且这之后的练习涉及实施这些事情......)

答案 2 :(得分:1)

如果数组是并行的,那么你可以使用一个循环:

public void displayArray()
{
    for(int i = 0 ; i < names.length ; i++)
    {
        /*
         *  If the first or last name are null then skip over and go to the 
         *      next item
         */
        if(names[i][0] == null || names[i][1] == null)
        {
            continue;
        }

        for(int j = 0; j < firstNLast; j++)
        {
            finalOutput.append(
                String.format("%10s%s%10s%s", 
                        names[i][j], " ", marks[i][j], " "));
        }

        finalOutput.append("\n");
    }
}