比较java中的两个字符串 - compareTo

时间:2013-07-06 02:53:50

标签: java compareto

我一直在线程“main”java.lang.ClassCastException中得到Exception:studentscoresapp.Student无法强制转换为java.lang.Comparable我无法找出原因。也许有人可以看一看并告诉我在哪里搞砸了。我已经搞乱了几个小时,似乎我正在使程序变得更糟,我在网上找到的任何东西似乎都没有用。感谢

public class Student implements IComparable<Student>
{
    private String lastName;
    private String firstName;
    private int score;

    public Student(String lastName, String firstName, int score)
    {
        this.lastName = lastName;
        this.firstName = firstName;
        this.score = score;
    }

    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * @return the score
     */
    public int getScore() {
        return score;
    }

    /**
     * @param score the score to set
     */
    public void setScore(int score) {
    this.score = score;
    }

    @Override
    public int compareTo(Object obj)
        {
        Student i = (Student) obj;
        if (i.lastName.equals(lastName)) {
            return firstName.compareToIgnoreCase(i.firstName);
        } else {
            return lastName.compareToIgnoreCase(i.lastName);
        }
    }

}

我的compareTo覆盖界面

public interface IComparable<E> {
    int compareTo(Object object);
}

和学生评分应用

public class StudentScoresApp {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Welcome message
        System.out.println("Welcome to the Student Scores Application.");
        System.out.println();
        int count = ConsoleValidator.getInt("Enter number of students to enter: ", 0);
        Student[] student = new Student[count];
        for (int j = 0; count > j; j++)
        {
            student[j] = getItem();
            System.out.println();
        }
        Arrays.sort(student);
        for (Student i : student)
        {
            System.out.println(i.getLastName() + " " + i.getFirstName() + ": " + i.getScore() + "\n");
        }
    }
    public static Student getItem()
    {
        String name = ConsoleValidator.getString("Student first name: ");
        String last = ConsoleValidator.getString("Student last name: ");
        int score = ConsoleValidator.getInt("Student score: ", 0);
        Student j = new Student(name,last,score);
        return j;
}

}

4 个答案:

答案 0 :(得分:8)

异常可能来自这一行。

Arrays.sort(student);

内部Arrays.sort()将尝试将传递的数组的元素转换为Comparable,这样它就可以调用它们的compareTo()方法。这就是你得到一个类强制转换异常的原因。

学生必须实施可比较。请勿使用您自己的 IComparable 界面,而应使用 java.lang.Comparable

答案 1 :(得分:1)

虽然,您应该使用标准Comparable界面,但您编写自己的界面也存在缺陷。它尝试使用泛型,但在声明方法时放弃它。正确的实施应该是

public interface IComparable<T> { // Use of T for types recommended
    int compareTo(T object); // Use the generic type for method as well
}

使用标准java.lang.Comparable界面,你应该使用泛型,如

public class Student implements Comparable<Student> {
  // ...
  public int compareTo(Student obj) { // No need for casting now
    if (obj.lastName.equals(lastName)) {
        return firstName.compareToIgnoreCase(obj.firstName);
    } else {
        return lastName.compareToIgnoreCase(obj.lastName);
    }
  }
}

答案 2 :(得分:1)

对于方法Array.sort(),有一个描述为:
'数组中的所有元素都必须实现Comparable接口' 您可以创建IComparable接口而不是Comparable 我认为这是不正确的 我将界面更改为Comparable,它可以工作。

感谢您的分享。

的问候,
汉克斯。

答案 3 :(得分:1)

你想如何对学生进行排序, 以下是我们如何根据学生的分数对学生进行排序 在这里输入代码

First,Convert Student class into List<Student<String, String, Integer>> studentList

然后使用这段代码

Collections.sort(studentList, new Comparator<Student>()  
    {
          public int compare(Student c1, Student c2)
          {
            if (c1.getScore() < c2.getScore()) 
                return -1;
            if (c1.getScore() > c2.getScore()) 
                return 1;
            return 0;
          }
    });

这将根据分数按升序对studentList列表进行排序。