【问题标题】:Can I sort primitive array of objects by float field value in Java? [duplicate]我可以通过 Java 中的浮点字段值对对象的原始数组进行排序吗? [复制]
【发布时间】:2025-12-06 10:30:01
【问题描述】:

我寻找一种最简单的方法来按浮点字段对数组中的对象进行排序。

当我从Main(); 调用方法sort(); 时,我有java.lang.NullPointerException

如何按student[].Rating 对这些对象进行排序?任何的想法? 这是我的课:

public class Students {

public static String First_Name;
public static String Last_Name;
public static String id;
public static String Spec;
public static String Course;
public static String Ratingstr;
public float Rating;
public static int Number_of_students;
Students student[] = new Students[100];

public void sort() {

    int j;
    boolean flag = true;   // set flag to true to begin first pass
    Students temp;   //holding variable

    while (flag) {
        flag = false;    //set flag to false awaiting a possible swap
        for (j = 0; j < student.length - 1; j++) {
            if (student[ j].Rating < student[j + 1].Rating) // change to > for ascending sort
            {
                temp = student[ j];                //swap elements
                student[ j] = student[ j + 1];
                student[ j + 1] = temp;
                flag = true;              //shows a swap occurred 
            }
        }
    }
}

public void Read() {
    try {
        File fXmlFile = new File("C://Students.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        //optional, but recommended
        //read this - http://*.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
        doc.getDocumentElement().normalize();

        //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
        NodeList nList = doc.getElementsByTagName("student");
        System.out.println("----------------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

            Node nNode = nList.item(temp);

            //System.out.println("\nCurrent Element :" + nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;
                System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
                System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
                System.out.println("Student id : " + eElement.getAttribute("id"));
                System.out.println("Spec : " + eElement.getElementsByTagName("spec").item(0).getTextContent());
                System.out.println("Course : " + eElement.getElementsByTagName("course").item(0).getTextContent());
                System.out.println("Rating : " + eElement.getElementsByTagName("rating").item(0).getTextContent());

            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void Read2() {
    try {
        File fXmlFile = new File("C://Students.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        //optional, but recommended
        //read this - http://*.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
        doc.getDocumentElement().normalize();

        //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
        NodeList nList = doc.getElementsByTagName("student");
        //System.out.println("----------------------------");

        for (Number_of_students = 0; Number_of_students < nList.getLength(); Number_of_students++) {
            //   Node nNode = nList.item(0);
            Node nNode = nList.item(Number_of_students);
            //System.out.println("\nCurrent Element :" + nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;

                student[Number_of_students] = new Students();

                student[Number_of_students].First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent();
                student[Number_of_students].Last_Name = eElement.getElementsByTagName("lastname").item(0).getTextContent();
                student[Number_of_students].Course = eElement.getElementsByTagName("course").item(0).getTextContent();
                student[Number_of_students].Ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent();
                student[Number_of_students].id = eElement.getAttribute("id");
                student[Number_of_students].Spec = eElement.getElementsByTagName("spec").item(0).getTextContent();

                System.out.println("----------------------------");

                student[Number_of_students].Rating = Float.parseFloat(student[Number_of_students].Ratingstr);

                String Ratingstr = Float.toString(student[Number_of_students].Rating);
                System.out.println("Rate is : " + Ratingstr);
                System.out.println("First Name : " + First_Name);
                System.out.println("Last Name : " + Last_Name);
                System.out.println("Student id is : " + id);
                System.out.println("Spec : " + Spec);
                System.out.println("Course is : " + Course);
                System.out.println("----------------------------");
                System.out.println("//////////////////////////");
            }

        }

    } catch (Exception e) {
    }

}

public static void main(String argv[]) {
    new Students().Read2();
    new Students().sort();

}

public void print() {

    System.out.println("----------------------------");

    // String Ratingstr = Float.toString(student[Number_of_students].Rating);
    System.out.println("Rate is : " + Ratingstr);
    System.out.println("First Name : " + First_Name);
    System.out.println("Last Name : " + Last_Name);
    System.out.println("Student id is : " + id);
    System.out.println("Spec : " + Spec);
    System.out.println("Course is : " + Course);
    System.out.println("----------------------------");
    System.out.println("//////////////////////////");

}

} 

【问题讨论】:

    标签: java arrays sorting object


    【解决方案1】:

    在您的main 方法中,您正在创建Students 对象并读取其字段Students[] student 内的数据。之后,您将删除此对象,创建新对象并尝试对其为空的student 数据进行排序。这种方式会更好:

    public static void main(String argv[]) {
        Students s = new Students();
        s.Read2();
        s.sort();
    }
    

    不用说你的代码是一团糟。

    【讨论】:

      【解决方案2】:

      我猜这与您正在创建一个包含 100 个学生的数组有关

      Students student[] = new Students[100];
      

      但你读的书不到一百。所以在数组中会有null 引用。在排序过程中,您尝试对一百名学生进行排序,而不是仅对阅读学生的数量进行排序。

      【讨论】:

        【解决方案3】:

        您正在使用匿名对象进行读取和排序,因此它们正在处理两个不同的对象,

        【讨论】:

          【解决方案4】:

          首先,让我们稍微回顾一下您的代码:

          上课Student

          class Student {
              private String first_Name;
              private String last_Name;
              private String id;
              private String spec;
              private String course;
              private float rating;
          
             public Student(String first_Name, String last_Name,String id,
                            String spec,String course,float rating){
          
                  this.first_Name=first_Name;
                  this.last_Name=last_Name;
                  this.id=id;
                  this.spec=spec;
                  this.course=course;
                  this.rating=rating;
          
             }
          
             // getters and setters
             ...
          }
          

          然后在Students主类

          public class Students {
          
              private static Student students[] = new Student[100];
          
          
              public void Read() {
                  //your code here
              }
          
              public void Read2() {
                  try {
                     File fXmlFile = new File("C://Students.xml");
                     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                     Document doc = dBuilder.parse(fXmlFile);umentElement().normalize();
                     NodeList nList = doc.getElementsByTagName("student");
          
                     for (int i = 0; i< nList.getLength(); i++) {
                      Node nNode = nList.item(i);
                      if (nNode.getNodeType() == Node.ELEMENT_NODE) {
          
                          Element eElement = (Element) nNode;
          
                          students[i] = new Student
                          (                                        
                            eElement.getElementsByTagName("firstname")
                            .item(0).getTextContent(),
          
                             eElement.getElementsByTagName("lastname")
                            .item(0).getTextContent(),
          
                             eElement.getAttribute("id"),
          
                             eElement.getElementsByTagName("spec")
                             .item(0).getTextContent(),
          
                              eElement.getElementsByTagName("course")
                             .item(0).getTextContent(),
          
                             Float.parseFloat
                            (eElement.getElementsByTagName("rating")
                             .item(0).getTextContent())
          
                          );
          
                          print(i);
                        }
                     }
                 } catch (Exception e) {
                     //stack trace
                 }
          
              }
          
              public static void main(String argv[]) {
                  Read2();
                  students.sort((s1, s2) -> s1.getRating().compareTo(s2.getRating()));
          
              }
          
              public void print(int i) {
          
          
                      System.out.println("----------------------------");
          
                      System.out.println("Rate is : " + students[i].getRate());
                      System.out.println("First Name : " + students[i].getFirst_Name());
                      System.out.println("Last Name : " + students[i].getLast_Name());
                      System.out.println("Student id is : " + students[i].getId());
                      System.out.println("Spec : " + students[i].getSpec());
                      System.out.println("Course is : " + students[i].getCourse());
                      System.out.println("----------------------------");
                      System.out.println("//////////////////////////");
              }
          }
          

          因此您可以在 java 8 中使用 Lambdas 对学生进行排序

          students.sort((s1, s2) -> s1.getRating().compareTo(s2.getRating()));
          

          【讨论】:

          • @HristoTsonev 尝试过任何给定的答案吗?讨论答案对于找到解决问题的最佳方法非常重要。
          最近更新 更多