我是Java新手(一般编码),所以我很抱歉提前出错。我确定这可能是一种更简单的方法,但我无法弄明白。 我觉得我也犯了一个非常明显的错误。
这就是我被要求做的事情:
编写一个程序,以随机顺序输入10个学生姓名 他/她相应的3个项目分数。将读取这些数据 分成两个独立的数组:一个用于保存名称的字符串数组,以及一个 用于保存分数的二维数组。你可以输入 来自键盘或文本文件的数据。
以表格形式输出输入数据。
使用选择排序,重新排列随机学生姓名 按字母顺序排列。显然需要相应的分数 按照排序顺序。 输出已排序的名称和分数 表格。
使用二进制搜索,您的程序将允许用户输入名称。 您的程序将输出名称及其相应的3项目 分数。
对于3个项目中的每个项目,输出学生的姓名 得分最高。
粗体部分是我被困的地方。我编译并正常运行,但是当打印表格时,只会输出最后输入的3个数字组合(是的,格式化需要处理,以便它是一个表格,这只是一个临时格式,直到我解决了这个问题) This is what I get.其他名字被切掉了,但无论如何他们都打印了相同的分数。
import java.util.Scanner;
/**Write a program that will input 10 students names
* in random order and their corresponding 3 project scores.
* Data will be read into 2 separate arrays: an array of strings
* for the names and a 2D array for the scores.
* Output input data in table form
*For each of the 3 projects, output the name of the student(s) who scored
the highest mark.
**/
public class NameAndGrades
{
public static void main (String[] args)
{
//Scanner object to allow user input
Scanner scnr = new Scanner(System.in);
//This array will store the names of the students
String[] names = new String[10];
//This 2D array will store the 3 project scores
int[][] scores = new int [10][3];
//Ask user to input the student names
System.out.println("Enter the 10 student names: ");
for (int index = 0; index < 10; index++)
{
System.out.print("Student " + (index +1) + ": ");
names[index] = scnr.nextLine();
}
selectionSort(names);
//Will print the names alphabetically
//THIS WILL BE DELETED LATER, IT WAS JUST TO CHECK IF IT DID ITS JOB
System.out.println("The students' names in alphabetical order: ");
for (int i = 0; i < names.length; i++)
{
System.out.println( names[i] );
}
//Ask user to enter the corresponding project scores
System.out.println("Enter the 3 project "
+ "scores for each student: ");
for (int row = 0; row < scores.length; row++)
{
for (int i = 0; i < names.length; i++)
{
for (int col = 0; col < scores[row].length; col++)
{
System.out.print(names[i] + " Test "
+ (col +1) + ": ");
scores[row][col] = scnr.nextInt();
}
}
break;
}
//PRINT NAMES AND SCORES SIDE BY SIDE
//MAKE TABLE HEADING HERE
for (int row = 0; row < scores.length; row++)
{
for (int i = 0; i < names.length; i++)
{
System.out.println(names[i] + " grades: ");
for (int col = 0; col < scores[row].length; col++)
{
System.out.print(scores[row][col] + " ");
}
System.out.println();
}break;
}
}
/**Selection sort method made to sort the student names in
* alphabetical order.
@param names names of students
@return the names organized alphabetically
**/
public static String[] selectionSort(String[] names)
{
for (int index = 0; index < names.length - 1; ++index)
{
int minIndex = index;
for (int j = index + 1; j < names.length; ++j)
{
if (names[j].compareTo(names[minIndex]) < 0)
{
minIndex = j;
}
}
String temp = names[index];
names[index] = names[minIndex];
names[minIndex] = temp;
}
return (names);
}
}
我如何编辑这个,以便每个学生都有正确的分数? 提前感谢您的帮助!!
答案 0 :(得分:0)
请注意,得分数组和名称数组是相关的。因此,正如您所做的那样,输入名称,对其进行排序,然后要求用户输入分数。这意味着您在排序名称时不必处理分数。这意味着
names[i] has the scores in scores[i][0...2]
for(int i = 0; i < names.length; ++i)
print names[i] + " : " + scores[i][0] + ", " + scores[i][1] + ", " + scores[i][2] ;
此外,您可能希望使用固定宽度。查找输出格式化程序以正确格式化表。
理想情况下,您需要创建一个包含名称和三个标记作为数据的类,并实现自定义Comparator
(比较字典顺序的名称),然后将列表存储在{{1并排序它。
修改强>
根据您的问题(以及评论中提到的),您可能希望首先获取输入然后排序,这意味着您需要以与对名称相同的方式处理分数,即{{1} }和ArrayList
已交换,因此应names[i]
和names[j]
。