【问题标题】:I am trying to get one value, while using indexing from 3 Arrays?我试图获得一个值,同时使用来自 3 个数组的索引?
【发布时间】:2018-06-22 18:27:39
【问题描述】:
name[5] = {Peter, James, Roger, Peter, Josę};

subject[5] = {English, Math, English, Science, Math};

grade[5] = {96, 67, 78, 84, 100};

我在这里想要实现的是获得个人获得最高分的主题。注意名称数组中名称的重复,这是同一个人。我试图做的是使用地图来获得结果,但是对于 3 个数组,对于我目前拥有的 java 级别来说这是相当棘手的。我想获取学生的姓名,将其与他们的成绩相匹配,然后选择成绩最高的学科,所以基本上每个学生姓名的返回值都是一个值。就这样,

英语 数学 英语 数学

【问题讨论】:

  • 请发布您的代码。
  • namesubjectgrade 数组中剩余的数组包含什么(例如subject[4])?
  • 另外,如果我要得到像彼得这样的每个人的总成绩是 180,那么最好的方法是什么,然后用这个作为总分

标签: java arrays indexing


【解决方案1】:

我将创建一个名为 getStudentsHighestMark 的方法,该方法获取姓名和成绩数据。该方法将遍历成绩并仅考虑相关学生的成绩。您需要一个 int 来跟踪您看到的该名称的最高成绩,以及该成绩对应的课程的字符串。遍历成绩后,只需返回学生最高分的课程名称。像这样的:

public static void main(String[] args) {
    String[] names = {"Peter", "James", "Roger", "Peter", "Jose"};
    String[] subjects = {"English", "Math", "English", "Science", "Math"};
    int[] grades = {96, 67, 78, 84, 100};

    String petersBest = getStudentsHighestMark("Peter", names, subjects, grades);
    System.out.println("Peter's best is: " + petersBest); //Peter's best is: English
    String jamesBest = getStudentsHighestMark("James", names, subjects, grades);
    System.out.println("James's best is: " + jamesBest);  //James's best is: Math
    String rogersBest = getStudentsHighestMark("Roger", names, subjects, grades);
    System.out.println("Roger's best is: " + rogersBest);  //Roger's best is: English
    String josesBest = getStudentsHighestMark("Jose", names, subjects, grades);
    System.out.println("Jose's best is: " + josesBest);  //Jose's best is: Math
}

private static String getStudentsHighestMark(String name, String[] names, String[] subjects, int[] grades) {
    int highestGrade = 0;
    String bestCourse = "";
    for(int i = 0; i < names.length; i++) {
        if(names[i].equals(name) && grades[i] > highestGrade) {
            highestGrade = grades[i];
            bestCourse = subjects[i];
        }
    }
    return bestCourse;
}

【讨论】:

    【解决方案2】:

    首先我会得到一个与每个名称相关的索引列表:

    HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();
    int index = 0;
    for (String n: name) {
        if (!map.containsKey(n)) {
            map.put(n, new ArrayList<Integer>());
        }
        map.get(n).add(index);
        index++;
    }
    

    然后我会遍历每个名​​称:

    for (String name : map.keySet()) {
    

    获取他们的索引,并找到最高分数的索引:

        List<Integer> indices = map.get(name);
        int maxScore = 0, maxIndex = 0;
    
        for (int index: indices) {
            if (grades[index] > maxScore) {
                maxIndex = index;
            }
        }
    

    然后我会从主题数组中打印出相同的索引:

        System.out.println(name + " did best in " + subject[index]);
    }
    

    【讨论】:

      【解决方案3】:

      Java 8 解决方案:我会编写一个对象并丢弃分数最低的对象。请在下面找到代码 sn-p。

      public class Main {
      
      public static void main(String[] args) {
          String[] names = {"Peter", "James", "Roger", "Peter", "Jose"};
          String[] subjects = {"English", "Math", "English", "Science", "Math"};
          int[] grades = {96, 67, 78, 84, 100};
          System.out.println(getStudentWithHighScoredSubjects(names, subjects, grades));
      }
      
      public static Map<String, String> getStudentWithHighScoredSubjects(String[] names, String[] subjects, int[] grades) {
          return IntStream.range(0, names.length)
                  .mapToObj(i -> new StudentHighestGradeSubject(names[i], subjects[i], grades[i]))
                  .collect(Collectors.toMap(StudentHighestGradeSubject::getName, Function.identity(), (s1, s2) -> {
                      if (s1.getGrade() > s2.getGrade()) {
                          return s1;
                      } else {
                          return s2;
                      }
                  }, LinkedHashMap::new))
                  .entrySet()
                  .stream()
                  .collect(Collectors.toMap(Map.Entry::getKey, e-> e.getValue().getHighestGradeSubject(), (s1, s2) -> s2, LinkedHashMap::new));
      }
      
      private static class StudentHighestGradeSubject {
          private String name;
          private String highestGradeSubject;
          private int grade;
      
          public StudentHighestGradeSubject(String name, String highestGradeSubject, int grade) {
              this.name = name;
              this.highestGradeSubject = highestGradeSubject;
              this.grade = grade;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getHighestGradeSubject() {
              return highestGradeSubject;
          }
      
          public void setHighestGradeSubject(String highestGradeSubject) {
              this.highestGradeSubject = highestGradeSubject;
          }
      
          public int getGrade() {
              return grade;
          }
      
          public void setGrade(int grade) {
              this.grade = grade;
          }
      
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              if (o == null || getClass() != o.getClass()) return false;
              StudentHighestGradeSubject that = (StudentHighestGradeSubject) o;
              return Objects.equals(name, that.name);
          }
      
          @Override
          public int hashCode() {
              return Objects.hash(name);
          }
      }
      

      }

      上面给出了执行时的以下输出

      {Peter=English, James=Math, Roger=English, Jose=Math}
      

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        • 2021-04-20
        • 2018-03-28
        • 2021-11-24
        • 1970-01-01
        • 2022-11-07
        相关资源
        最近更新 更多