Java 对对象数组进行排序

标签 java

我有一个成员(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());
    }
}

最佳答案

问题

  1. 您正在对整个 memberList 进行排序而您应该首先找到满足上述条件的所有学生,然后对列表进行一次排序。
  2. 您不应该对 memberList 进行排序在每次迭代中,因为它是错误的并且非常低效。
  3. 在打印时,您再次打印整个列表,而不仅仅是分数大于 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
  1. Arrays.stream创建 Stream<Member>
  2. filter只保留分数大于50的男性成员
  3. sorted根据成员的分数从最高到最低对成员进行排序。
  4. forEachOrdered然后打印结果。

关于Java 对对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964730/

相关文章:

java - 如何使用尊重自定义注释的 jackson 执行自定义 JSON 反序列化?

java - 如何更新不断变化的 GUI 而不会因更新而闪烁(图形 g)?

java - 如何映射包含名为 long 和 Short 的成员的 JSON 字符串

java - 确定变量类型

java - 可能不存在的属性的 JSP bean 标记

java - Android 2.3.3 媒体播放器出现 NullPointerException

java - 为什么 JAXB 生成的类具有 protected 成员,我该如何更改它?

java - 简单替换密码

java - Maven - 编译主模块时未检测到

java - 为什么 System.nanoTime() 比 System.currentTimeMillis() 慢(在性能上)?