0

在过去的几天里,我一直在研究这个程序,并且确切地知道我想做什么,只是不知道如何去做。基本上我有两个数组,一个是包含学生姓名的字符串,另一个数组是一个包含学生分数的 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]);
        }
    }
}
4

4 回答 4

3

为了使其工作,您必须保持阵列同步。移动成绩时,必须以完全相同的方式移动对应的名称,以便名称数组和成绩数组始终保持协调。

您可能已经明白了,很难从代码中分辨出来。如果是这样,您将需要在同一个块 ({}) 中移动名称,就像等级移动一样,这将是最有意义的,或者您需要将必要的整数存储在某处以便另一个块可以使用他们。


除了回答:

你有两个数组,它们的值如下

peter    45
alice    53
garth    50

(我们希望这不是100分的考试)

您正在对第二个数组进行排序;您的最大值等都与该数组中的分数有关。

假设您达到了将 garth 的分数与 alice 的分数交换的地步。在某些变量或其他变量中,garth 的值为 2,alice 的值为 1,并且将 50 放入 temp var,将 alice 的 53 放入位置 2,并将 garth 的 50 放入位置 1。

您需要做的是使用这些相同的索引来移动名称,因此您将 garth 放在位置 1 中,将 alice 放在位置 2 中。完成后,您将拥有:

peter   45
garth   50
alice   53

对于字符串的位置,您不需要任何其他变量;您需要将字符串放入字符串数组中与您在分数数组中移动的分数相同的位置。

于 2013-10-20T02:49:43.760 回答
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语句中进行交换时,请使用currentMaxIndexfor both 数组交换。

编辑:与交换

// 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

于 2013-10-20T02:50:26.823 回答
1

有两种方法可以解决这个问题,一种是您可以使用 Map 类来保存与学生姓名和分数对应的名称值对。您需要查看 Map 接口及其实现类(例如 HashMap)的 javadoc。你会这样声明它:

Map<String, Integer> nameGradeMap = new HashMap<String, Integer>(); 

之后,对 hashmap 的键和值进行排序。这可以通过调用Collections.sort()方法来完成。

第二个选项是将学生姓名(字符串)和成绩(整数)封装为某个类的实例变量,例如学生。然后使用自定义比较器实现按名称排序,然后按分数排序。您需要阅读 Comparable 接口的 javadoc 并查看一些有关如何使用它的示例。同样,您将使用对它们的调用对它们进行排序Collections.sort()。我想这应该足以让您查找以帮助您入门。

于 2013-10-20T02:53:18.547 回答
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);        
      }

      }
于 2013-10-20T14:31:09.210 回答