我有一个成员(member)应用程序,数据将进入一个对象,然后该对象存储在数组中。我在对象中使用字符串和整数。
我正在编写一种方法来显示所有男性成员并按分数对他们进行排序,但我正在努力解决这个问题的逻辑。
我想一旦我将男性成员从主数组中取出,我可能需要创建另一个数组来存储它们,但我不太确定。
谁能帮忙。
public static void displayAllMaleMembers(){
System.out.println("List of male members:\n");
for (int i=0; i < memberCount; i++) {
Member member = memberList[i];
if (member.getGender().equals("male") && member.getScore() > 50){
System.out.println("Name: " +member.getName());
System.out.println("Score: " +member.getScore());
System.out.println();
}
Arrays.sort(memberList, Collections.reverseOrder());
}
System.out.println("The sorted names by score are:");
for (Member member : memberList) {
System.out.println("Name: " +member.getName());
System.out.println("Handicap: " +member.getScore());
}
}
最佳答案
问题
- 您正在对整个
memberList
进行排序而您应该首先找到满足上述条件的所有学生,然后对列表进行一次排序。 - 您不应该对
memberList
进行排序在每次迭代中,因为它是错误的并且非常低效。 - 在打印时,您再次打印整个列表,而不仅仅是分数大于
50
的男性成员。 .
解决方案
首先,您只需要复制分数大于 50
的男性成员到列表:
List<Member> result = new ArrayList<>();
for(Member member : memberList)
if ("male".equals(member.getGender())
&& member.getScore() > 50)
result.add(member);
然后按成员(member)分数降序排序:
result.sort(Comparator.comparingInt(Member::getScore).reversed());
然后打印:
result.forEach(member -> {
System.out.println("Name: " +member.getName());
System.out.println("Score: " +member.getScore());
System.out.println();
});
完整代码:
List<Member> result = new ArrayList<>();
for(Member member : memberList)
if ("male".equals(member.getGender())
&& member.getScore() > 50)
result.add(member);
result.sort(Comparator.comparingInt(Member::getScore).reversed());
result.forEach(member -> {
System.out.println("Name: " +member.getName());
System.out.println("Score: " +member.getScore());
System.out.println();
});
由于您只想要根据某些条件对男性成员进行降序排序的结果,因此您也可以使用流方法,因为对于这种类型的用例来说,它更具可读性且更容易,即过滤,然后应用进一步的逻辑:
Arrays.stream(memberList) // create a Stream<Member>
.filter(m -> "male".equals(m.getGender()) &&
m.getScore() > 50) // retain only male members with score greater than 50
.sorted(Comparator.comparingInt(Member::getScore).reversed()) // sort based on score descending i.e. highest to lowest
.forEachOrdered(m -> {
System.out.println("Name: " +m.getName());
System.out.println("Handicap: " +m.getScore());
System.out.println();
}); // print the result
-
Arrays.stream
创建Stream<Member>
-
filter
只保留分数大于50的男性成员 -
sorted
根据成员的分数从最高到最低对成员进行排序。 -
forEachOrdered
然后打印结果。
关于Java 对对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964730/