【问题标题】:Using a seperate bubble sort class to sort objects based on field of double使用单独的冒泡排序类根据双精度字段对对象进行排序
【发布时间】:2014-03-11 14:08:29
【问题描述】:

我目前有以下学生课程

public class Student 

{
String name;
String address;
String major;
double gpa;
int ClassLevel;
int college;
String idNumber;



public Student(String name, String address, String major, double gpa, int ClassLevel, int college, String idNumber)
{
this.name = name;
this.address = address;
this.major = major;
this.gpa = gpa;
this.ClassLevel = ClassLevel;
this.college = college;
this.idNumber = idNumber;

}


public String toString()
{
return name + " is a student enrolled in college number " + college + " majoring in " + major + " with a GPA of " + gpa + ". He is studying his year " + ClassLevel + " and his M# is " + idNumber + ". His address is " + address + ".";

}

}

我有另一个类从文本文件中读取数据以创建一个包含 5 个学生对象的数组

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ReadStudent 
{
public static void main(String[] args) 
{

Scanner fileIn = null;
String name = null;
String address = null;
String major = null;
double gpa = 0;
int ClassLevel = 0;
int college = 0;
String idNumber = null;

try
{
    fileIn = new Scanner (new FileInputStream("student.dat"));

}
catch (FileNotFoundException e)
{
    System.out.println("file not found");
    System.exit(0);
}
Student[] object = new Student[5];

    int i = 0;
    while (fileIn.hasNextLine() && i <= 4)
    {
        name = fileIn.nextLine();
        address = fileIn.nextLine();
        major = fileIn.nextLine();
        gpa = fileIn.nextDouble();
        ClassLevel = fileIn.nextInt();
        college = fileIn.nextInt();
        idNumber = fileIn.nextLine();
        fileIn.nextLine();
        fileIn.nextLine();
        object[i] = new Student(name, address, major, gpa, ClassLevel, college, idNumber);      
        i++;

    }

for (int j =0; j<i; j++)
    System.out.println(object[j]);
}
}

我正在尝试在这些课程之外使用冒泡排序按 GPA 对这些学生进行排序

BubbleSort 类:

public class BubbleSort
{
public static void sort (int n, double [] array)
{
    double tempVar;
    for (int i = 0; i<n-1; i++)
    {
        for (int j = 0; j<n-1; j++)
        {
            if (array[i] > array[j + 1])
            {
                tempVar = array [j+1];
                array [j+1] = array[i];
                array [i] = tempVar;
            }
        }
    }
}
}
}

我不确定如何调用排序...BubbleSort.sort [4, ???]

【问题讨论】:

    标签: java eclipse sorting bubble-sort


    【解决方案1】:

    为什么不将一个学生数组传递给该方法,并以array[i].gpa &gt; array[j + 1].gpa 进行比较? (请注意,您可能必须提供一个 getter 才能访问 gpa)。

    更灵活的方法是使用Comparable 接口或Comparator,就像Collections.sort(...) 一样。

    public static <T extends Comparable<T>> void sort( int n, T[] array ) {
      T tempVar;
      for( int i = 0; i < n - 1; i++ ) {
        for( int j = 0; j < n - 1; j++ ) {
          if( array[i].compareTo( array[j + 1]) > 0 ) {
            tempVar = array[j + 1];
            array[j + 1] = array[i];
            array[i] = tempVar;
          }
        }
      }
    }
    
    class Student implements Comparable<Student> {
      public int compareTo( Student s ) {
        //compare gpa here
      }
    }
    

    使用比较器,您不必实现Comparable,而是提供Comparator&lt;Student&gt; 的合适实例,例如

    public static <T> void sort( int n, T[] array, Comparator<T> comparator ) {
      T tempVar;
      for( int i = 0; i < n - 1; i++ ) {
        for( int j = 0; j < n - 1; j++ ) {
          if( comparator.compare( array[i], array[j + 1]) > 0 ) {
            tempVar = array[j + 1];
            array[j + 1] = array[i];
            array[i] = tempVar;
          }
        }
      }
    }
    
    BubbleSort.sort( students.length, students, new Comparator<Student>() {
      public int compare(Stundent lhs, Student rhs ) {
        //compare gpa
      }
    });
    

    【讨论】:

    • 执行array[i].compareTo( array[j + 1]) &gt; 0 并让compareTo 返回-1,0,1
    • @kai 你到底是什么意思?我的例子有错误吗?
    • 不,但compareTo() 的标准实现应该返回-1、0 或1。如果你这样做comparator.compare( array[i], array[j + 1]) &gt; 1),它总是错误的。还是我错了?
    • 太棒了!感谢您的帮助!
    猜你喜欢
    • 2022-01-25
    • 2019-05-10
    • 2017-09-27
    • 2021-06-10
    • 2018-09-22
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多