name[5] = {Peter, James, Roger, Peter, Josę};
subject[5] = {English, Math, English, Science, Math};
grade[5] = {96, 67, 78, 84, 100};
我在这里试图实现的是获得个人获得最高分数的主题。请注意名称数组中的重复姓名,这是同一个人。我尝试做的是使用map来实现结果,但是对于我目前拥有的java级别来说,使用3个数组是相当棘手的。我想要获取学生的名字,将其与他们的成绩相匹配,并选择具有最高分数的科目,因此基本上每个学生的名字返回一个值。所以像这样,
英语数学英语数学
发布于 2018-06-23 02:42:23
首先,我将获得与每个名称相关联的索引列表:
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;
}
}
然后我将从subjects数组中打印出相同的索引:
System.out.println(name + " did best in " + subject[index]);
}
发布于 2018-06-23 02:39:45
我将创建一个名为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;
}
发布于 2018-06-23 04:03:13
Java 8解决方案:我将组合一个对象,并丢弃分数最低的对象。请找到下面的代码片段。
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}
https://stackoverflow.com/questions/50993755
复制相似问题