简体   繁体   English

Java对对象数组进行排序

[英]Java sorting an object array

I have a member application, the data is going into an object and then the object is being stored in the array.我有一个成员应用程序,数据进入一个对象,然后该对象被存储在数组中。 I am using string and integers in the object.我在对象中使用字符串和整数。

I am writing a method to display all male members and sort them by their score but I am struggling with the logic for this.我正在编写一种方法来显示所有男性成员并按他们的分数对他们进行排序,但我正在为这个逻辑而苦苦挣扎。

I am thinking I might need to create another array to store the male members in once I have got them out of the main array but am not really sure.我想我可能需要创建另一个数组来存储男性成员,一旦我将他们从主数组中取出,但我不确定。

Could anyone help please.任何人都可以请帮忙。

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());
    }
}

The Problem问题

  1. You're sorting the entire memberList whereas you should first find all the students satisfying the said criteria and then sort the list once.您正在对整个memberList排序,而您应该首先找到满足上述条件的所有学生,然后对列表进行一次排序。
  2. You should not sort the memberList in each iteration as it's wrong and very inefficient.您不应该在每次迭代中对memberList进行排序,因为它是错误的并且非常低效。
  3. When it comes to printing, again you're printing the entire list not just the male members with scores greater than 50 .在打印时,您再次打印整个列表,而不仅仅是分数大于50的男性成员。

The Solution解决方案

First, you will need to copy only the male members with scores greater than 50 to a list:首先,您只需要将得分大于50的男性成员复制到列表中:

List<Member> result = new ArrayList<>();
for(Member member : memberList)
    if ("male".equals(member.getGender()) 
                && member.getScore() > 50)
          result.add(member);

then sort it descending by member score:然后按成员分数降序排序:

result.sort(Comparator.comparingInt(Member::getScore).reversed());

then print:然后打印:

result.forEach(member -> {
     System.out.println("Name:  " +member.getName());
     System.out.println("Score: " +member.getScore()); 
     System.out.println();   
});

Full code:完整代码:

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();   
});

Since you only want a result of male members sorted descending based on some criteria, you could also go with the stream approach simply because it's more readable and easier for this type of use case ie filtering and then applying further logic:由于您只希望男性成员根据某些条件进行降序排序,因此您也可以使用流方法,因为它对于此类用例更具可读性和更容易,即过滤然后应用进一步的逻辑:

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 creates a Stream<Member> Arrays.stream创建一个Stream<Member>
  2. filter retains only the male members with score greater than 50 filter只保留得分大于 50 的男性成员
  3. sorted sorts the members based on their scores from highest to lowest. sorted根据成员的分数从高到低对成员sorted排序。
  4. forEachOrdered then prints the results. forEachOrdered然后打印结果。

You need to have your Member class implement Comparable and then implement the compareTo function however you want您需要让您的 Member 类实现 Comparable,然后根据需要实现 compareTo 函数

https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

First, the sort operation should be outside the for loop as tyou want to do that only one time.首先,排序操作应该在 for 循环之外,因为您只想这样做一次。 Second, you can sort the list in this way:其次,您可以通过这种方式对列表进行排序:

memberList.sort(Comparator.comparing(Member::getScore));

If your data are not stored in a List you can sort them in this way:如果您的数据未存储在List您可以按以下方式对它们进行排序:

Arrays.sort(memberList, Comparator.comparingInt(Member::getScore));

Otherwise let your Member class implement Combarable interface.否则让您的Member类实现Combarable接口。

If your Java version is 1.8 or greater , you can use Stream with an easiest way.如果您的 Java 版本是 1.8 或更高版本,则可以以最简单的方式使用 Stream。

final List<Member> memberListWhichIsMaleAndScoreGreaterThan50 = Arrays.stream(memberList)
        .filter(member -> member.getGender().equals("male") && member.getScore() > 50)
        .collect(Collectors.toList());
//do  whatever you want on this list.

Here filter is filtering the list with gender and score .这里的filter是用性别分数过滤列表。 After that collecting to list to make an operation if you want.之后,如果您愿意,可以将其收集到列表中进行操作。

I have a nice solution for you.我有一个很好的解决方案给你。 Using constructors and getters and setters, without complex functions.使用构造函数和 getter 和 setter,没有复杂的功能。 Due to you only need to print name and score you can concatenate them as a single string, sort them and finally divide the string.由于您只需要打印 name 和 score,您可以将它们连接为单个字符串,对它们进行排序,最后分割字符串。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class foo {

public Member me = new Member();

public void displayAllMaleMembers() {

    System.out.println("List of male members:");
    for (Member member : me.getMembers()) {
        if (member.getGender().equals("male") && member.getScore() > 50) {
            System.out.println("Name:  " + member.getName());
            System.out.println("Score: " + member.getScore());
            System.out.println();
        }
    }

    System.out.println("The sorted names by score are:");
    String[] sort = new String[me.getMembers().size()];
    // concatenate name + comma + score
    for (int i = 0; i < sort.length; i++) {
        sort[i] = me.getMembers().get(i).getName() + "," + me.getMembers().get(i).getScore();
    }
    Arrays.sort(sort, Collections.reverseOrder()); // sort the concatenated string
    // prints
    for (String s : sort) {
// Split() divides the concatenated string, 
// [0] is the first position of the string[] returned by spit(",");
        System.out.println("Name:     " + s.split(",")[0]); // string before comma: name
        System.out.println("Handicap: " + s.split(",")[1]); // string after comma: score
    }
}

//Main
public static void main(String[] args) {

    foo f = new foo();
    ArrayList<Member> m = new ArrayList<Member>();
    // Creates an arraylist using the constructor field from Member class
    m.add(new Member("Criss", 80, "male"));
    m.add(new Member("Frank", 20, "male"));
    m.add(new Member("Ann", 80, "femmale"));

    // adds the arraylist through setMembers method
    f.me.setMembers(m);
    // print data
    f.displayAllMaleMembers();
}

}

Getters and setters class: The arraylist<Members> stores all attributtes you need (score, name, gender) Getters 和 setters 类: arraylist<Members>存储您需要的所有属性(分数、姓名、性别)

import java.util.ArrayList;
public class Member {

String Name;
int Score;
String Gender;
ArrayList<Member> members = new ArrayList<>();

//Constructor using fields
public Member(String name, int score, String gender) {
    super();
    Name = name;
    Score = score;
    Gender = gender;
} 

// default
Member(){
}

public ArrayList<Member> getMembers() {
    return members;
}

// Creates an arrayList of Members
public void setMembers(ArrayList<Member> members) {
    this.members.addAll(members); //adds all arraylist items
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public int getScore() {
    return Score;
}

public void setScore(int score) {
    Score = score;
}

public String getGender() {
    return Gender;
}

public void setGender(String gender) {
    Gender = gender;
}
}

Output:输出:

List of male members:
Name:  Criss
Score: 80

The sorted names by score are:
Name:     Frank
Handicap: 20
Name:     Criss
Handicap: 80
Name:     Ann
Handicap: 80

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM