过去几天我一直在研究这个程序,并确切地知道我想做什么,而不是如何去做。基本上我有两个数组,一个是包含学生姓名的字符串,另一个是包含学生成绩的int。两个数组值都是用户输入的输入。最终我想要从最高分到最低分从高到低的顺序打印相应的名称和分数。现在,我的问题在于代码的结束,我不能为我的生活弄清楚如何使两个索引匹配println目的(我已经评论了问题所在。我的分数按降序打印从最高到最低,但我不能让名字符合要求。任何有关如何解决这个问题的建议都将不胜感激。
import java.util.Scanner;
public class TestArray
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
System.out.println("Enter the number of students in your class: ");
int number = input.nextInt();
System.out.println("Now enter the " + number + " students names");
String[] nameList = new String[number];
for (int i = 0; i < number; i++) {
nameList[i] = input.next();
}
System.out.println("Next, enter the score of each student: ");
int[] numGrades = new int[number];
for (int i = 0; i < number; i++) {
numGrades[i] = input.nextInt();
}
for (int i = 0; i < number; i++) {
int currentMax = numGrades[i];
int currentMaxIndex = i;
int currentNameIndex = i;
for (int j = i + 1; j < number; j++) {
if (currentMax < numGrades[j]) {
currentMax = numGrades[j];
currentMaxIndex = j; // index max
currentNameIndex = j;
}
}
if (currentMaxIndex != i) {
numGrades[currentMaxIndex] = numGrades[i];
numGrades[i] = currentMax;
}
if (currentNameIndex != i) {
nameList[currentNameIndex] = String.valueOf(nameList[i]);
// need nameList[i] to = the current index of the numGrades array HOW???
}
}
for (int i = 0; i < number; i++) {
System.out.println(nameList[i] + " had a score of " + numGrades[i]);
}
}
}
答案 0 :(得分:3)
为了使其正常工作,您必须保持阵列同步。移动成绩时,必须以完全相同的方式移动相应的名称,以便始终协调名称数组和成绩数组。
您可能已经明白,从代码中很难说清楚。如果是这样,你需要在同一个块({})内进行名称移动,这与等级移动一样,这将是最有意义的,或者您需要在某处存储必要的整数,以便另一个块可以使用它们。
除了回答:
你有两个数组,如
peter 45
alice 53
garth 50
(我们希望这不是100分的考试)
您正在排序第二个数组;你的最大值等都与该数组中的分数有关。
假设你达到了将garth的分数换成alice得分的程度。在一些变量或其他变量中,你将为garth设置2,为alice设置1,你将在温度变量中加入50,将alice的53放在position2中,并将garth的50放在第1位。
你要做的就是使用那些相同的索引来移动名字,所以你把garth放在位置1,将alice放在位置2.完成后,你有:
peter 45
garth 50
alice 53
字符串位置不需要任何其他变量;你需要将字符串放在字符串数组中与得分数组中移动的分数相同的位置。
答案 1 :(得分:1)
看来你有一些sorting
实施正在进行,所以这就是我的建议。
1
。当你将学生和成绩分成不同的数组时,他们应该按索引匹配,我相信你这样做了。
2。在排序实现中,当您对等级数组进行排序时,对于您交换的每个等级索引,对名称数组索引执行相同操作。这将保持两个数组的索引与匹配对
if(currentMaxIndex != i){
numGrades[currentMaxIndex] = numGrades[i];
numGrades[i] = currentMax;
// also swap the student name indices
// you indices should be the same for both arrays
}
//you don't need the other if statement, because you are swapping in the one above
在你的循环中,currentNameIndex
应该等于currentMaxIndex
,所以你真的不需要currentNameIndex
。当您使用if
语句进行交换时,请使用currentMaxIndex
进行数组交换。
编辑:使用swap
// Simple swap
int n = 1;
int n1 = 2;
int temp = n; // temp holds value of n (1)
n = n1; // now n = 2
n1 = temp // now n1 = 1
上面的交换示例,使用currentMaxIndex
答案 2 :(得分:1)
有两种方法可以解决这个问题,一种方法是使用Map类来保存与学生姓名和分数对应的名称值对。您需要查看Map接口及其实现类(例如HashMap)的javadoc。你会这样声明:
Map<String, Integer> nameGradeMap = new HashMap<String, Integer>();
后记,对哈希映射的键和值进行排序。这可以通过调用Collections.sort()
方法来完成。
第二个选项是将学生姓名(String)和成绩(整数)封装为某个类的实例变量,例如:学生。然后使用自定义比较器按名称实现排序,然后按分数实现排序。您需要阅读Comparable接口的javadoc并查看有关如何使用它的一些示例。您再次使用Collections.sort()
调用对它们进行排序。我想这应该足以让你抬头让你开始。
答案 3 :(得分:0)
仅供将来参考,以下是我提出的解决方案。请注意,我只更改了代码的最后一部分,只是包含了下面的部分。感谢所有帮助过我的人。
(int i = 0; i < number; i++){
int currentMax = numGrades[i];
int currentMaxIndex = i;
int currentNameIndex = i;
String currentName = nameList[i];
for (int j = i + 1; j < number; j++){
if(currentMax < numGrades[j] ){
currentMax = numGrades[j];
currentMaxIndex = j;
currentNameIndex = j;
currentName = nameList[j];
}
}
if(currentMaxIndex != i){
numGrades[currentMaxIndex] = numGrades[i];
numGrades[i] = currentMax;
nameList[currentNameIndex] = String.valueOf(nameList[i]);
nameList[i] = String.valueOf(currentName);
}
}