Java-Selection通过int键对对象数组进行排序并显示在表中

时间:2018-09-27 00:10:51

标签: java arrays sorting

我目前正在为一个学校项目工作,确实很挣扎。我应该选择对一组Student对象进行排序,然后按选择排序顺序显示它们。

  

创建一个大小为10的数组,并分配学生详细信息(姓名 BroncoId 年龄总分 >)到数组。执行选择排序,以根据学生的总成绩以降序对其进行排序。

     

a。步骤:

     

i。创建学生列表(使用Java中的Random类生成年龄(15-25)和总年龄(0-100))

     

ii。以表格格式打印学生列表

     

iii。根据学生的总成绩进行选择排序

我目前停留在的位置正在进行选择排序。我了解如何创建选择排序,但是对于这种实现,我似乎无法将其翻译。

我的选择排序代码:

+-----------------------+--------+-------+
|      "DateTimeS"      | "High" | "Low" |
+-----------------------+--------+-------+
| "2018-09-07 23:58:00" | "89"   | "87"  |
| "2018-09-07 23:57:00" | "88"   | "85"  |
| "2018-09-07 23:56:00" | "86"   | "82"  |
|        .              |        |       |
|        etc...         |        |       |
+-----------------------+--------+-------+

运行此代码时,控制台将返回:

我寻求辅导以期解决此问题,但是我的辅导员给了我一些不实用的建议。在会议结束时我们都很沮丧。

我的打印代码:

public static Student[] selectionSort(Student[] studentList)
{

    for(int i = 0; i <studentList.length-1; i++)
    {
        int minIndex = studentList[i].getGrades();
        int pos = i;

        for(int j = i + 1; j < studentList.length-2; j++)
        {

            if(studentList[j].getGrades() > studentList[minIndex].getGrades())
            {

                minIndex = studentList[j].getGrades();
                pos = j;

            }

        }

        int temp = studentList[pos].getGrades();
        studentList[pos] = studentList[i];
        int k = studentList[i].getGrades();
        k = temp;

    }
    return studentList;
}

作为一个出于激情的话题,我试图制作一种有趣的打印方法。我的问题是,例如,我真的不知道如何解析和格式化155个字符的字符串。我该怎么做才能做到这一点?

我希望程序输出一个对象名称行,例如:

  

49个字符
   49个字符
  
  剩下的一切

它可能永远不会超过三行,但是嘿,谁说我不能给出这样的例子?我要在while循环的标题中放入什么来完成此操作?

PS: 如果需要,这是学生班。

public static void printStudentInfo(Student[] students)
{


    System.out.println("Name:                                              AGE:  idNumber:  Score:");

    for(Student student: students)
    {
        if(student.getName().length() <= 49)
            System.out.printf("%-50s %-5d %-10s %-4d\n", student.getName(), student.getAge(), student.getID(), student.getGrades() );

        else
        {

            System.out.printf("%-50s %-5d %-10s %-4d\n", student.getName().substring(0,48), student.getAge(), student.getID(), student.getGrades() );

            System.out.println();
            int i = 0;

            while(i <= student.getName().length())
            {

                System.out.printf("%-50s", student.getName().substring(49 +48*i, 97+48*i) );
                System.out.println();
                i++;

            }



        }

    }

}

1 个答案:

答案 0 :(得分:2)

欢迎来到马修。

我认为与其给您解决方案,不如给您一个解决问题的方法,可能会很有用。

软件开发的良好做法是将问题分解为非常小的组件,确保每个组件都能正常工作(通过单元测试),然后从这些组件构建解决方案。

根据这种做法,我建议您执行以下操作:

  • 列出在纸上进行选择排序所需的每个步骤。
  • 选择最简单的一个(例如交换两个元素)。
  • 写一个单元测试,如果您的交换方法有效,该测试将通过
  • 运行单元测试并验证其是否失败
  • 编写最简单的代码即可通过测试
  • 编写新的测试以涵盖尚不支持的更复杂的情况
  • 一直坚持下去,直到您认为该方法行之有效
  • 转到下一个方法
  • 所有组件工作正常后,编写使用相同过程调用所有组件的方法(即先进行测试,然后进行代码)

如果按照此过程进行操作,那么最终您将获得一个可以完全理解,可以正常工作,可维护并且可以重构的系统。它还有另一个非常显着的好处:这意味着当您带着一个问题来到SO时,您会问的是您不知道如何解决而不是“为什么我的代码无法正常工作”的问题。特定的问题往往会得到更好,更快的答复。

在您的情况下,我将从交换项目的方法开始(提示:您的代码不起作用,编写单元测试时您会很快发现该代码),然后继续查找交换项目中最小的项目。子列表。然后是使用这两种方法将最小的项目放在子列表的开头的方法。最后,是一种对所有子列表逐步执行该方法的方法。在继续将它们放在一起之前,请确保每种方法都能正常工作,包括检查参数的有效性。