首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java : Class com.java8.不能将学生转换为java.lang.Comparable类

Java : Class com.java8.不能将学生转换为java.lang.Comparable类
EN

Stack Overflow用户
提问于 2022-06-14 06:47:19
回答 4查看 2.7K关注 0票数 0

我正在使用java 8 Student的自然排序方法迭代所有sorted()数据。在迭代学生数据时,在IDE控制台class com.java8.Student cannot be cast to class java.lang.Comparable中获取异常。我的StreamStudent.java文件在com.java8包中。

下面是我的完整堆栈跟踪:

代码语言:javascript
运行
复制
Exception in thread "main" java.lang.ClassCastException: class com.java8.Student cannot be cast to class java.lang.Comparable (com.java8.Student is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
    at java.base/java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47)
    at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.base/java.util.TimSort.sort(TimSort.java:220)
    at java.base/java.util.Arrays.sort(Arrays.java:1307)
    at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:353)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at com.java8.StreamStudent.main(StreamStudent.java:72)

下面是我的代码:

代码语言:javascript
运行
复制
package com.java8;

import java.util.*;
import java.util.stream.*;

class Student{
    String firstName;
    String lastName;
    Integer groupId;
    Integer age;

    // constructor and getter, setter

}

public class StreamStudent {
    public static void main(String[] args) {
        List<Student> stdList = new ArrayList<>();
        stdList.add(new Student("Sara", "Mills", 1, 18));
        stdList.add(new Student("Andrew", "Gibson", 2, 21));
        stdList.add(new Student("Craig", "Ellis", 1, 23));
        stdList.add(new Student("Steven", "Cole", 2, 19));
        stdList.add(new Student("Andrew", "Carter", 2, 2));

        
        System.out.println("1. Sort all student firstname by name");
        List<Student> students =  stdList.stream().sorted().collect(Collectors.toList());
        students.forEach((s) -> System.out.println(s.getFirstName() + " " + s.getLastName() + " " + s.getGroupId() + " " + s.getAge()));
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-06-14 06:49:36

Student必须实现可比的。可比较的实现定义了自然排序。

此接口对实现该接口的每个类的对象强制执行总体排序。这种排序称为类的自然排序,类的compareTo方法称为其自然比较方法。

代码语言:javascript
运行
复制
public class Student implements Comparable<Student> {

  @Override
  public int compareTo(Student o) {
    //implement comparison here
    return 0;
  }
}
票数 5
EN

Stack Overflow用户

发布于 2022-06-14 07:09:26

流的元素必须实现Comparable接口,才能通过sorted()流操作进行排序。或者,如果无法更改Student类的实现,则可以向重载的版本sorted(Comparator<? super T> comparator)提供Comparator实例。这样,您仍然可以对元素进行排序,而不必更改Student的实现。

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted-java.util.Comparator-

学生实施可比

代码语言:javascript
运行
复制
class Student implements Comparable<Student> {
    String firstName;
    String lastName;
    Integer groupId;
    Integer age;

    // constructor and getter, setter

    @Override
    public int compareTo(Student o) {
        return Comparator.comparing(Student::getFirstName).thenComparing(Student::getLastName).compare(this, o);
    }
}

public class StreamStudent {
    public static void main(String[] args) {
        // ... same code of yours ...

        List<Student> students =  stdList.stream().sorted().collect(Collectors.toList());

        // ... same code of yours ...
    }
}

为排序提供一个比较器

代码语言:javascript
运行
复制
public class StreamStudent {
    public static void main(String[] args) {
        // ... same code of yours ...

        List<Student> students =  stdList.stream().sorted(Comparator.comparing(Student::getFirstName).thenComparing(Student::getLastName)).collect(Collectors.toList());

        // ... same code of yours ...
    }
}     
票数 2
EN

Stack Overflow用户

发布于 2022-06-14 06:57:18

您的学生班级应该实现Comparable接口,以便对其进行排序:

代码语言:javascript
运行
复制
class Student implements Comparable<Student> {
    String firstName;
    String lastName;
    Integer groupId;
    Integer age;

    @Override
    public int compareTo(Student o) {
        return this.firstName.compareTo(o.firstName);

        //In case you want compare based on multiple fields
        /*
        return Comparator
              .comparing((Student s)->s.lastName)
              .thenComparing(s->s.firstName)
              .compare(this, o);
       */
    }
}

另一种解决方案是为类实现比较器接口,并将其作为输入传递给排序方法,在需要在不同位置根据不同字段进行排序的情况下,这是非常有用的:

代码语言:javascript
运行
复制
Comparator<Student> studentComparator
        = Comparator.comparing(Student::getLastName).thenComparing(Student::getFirstName);

List<Student> studentsSorted =  stdList.stream().sorted(studentComparator).collect(Collectors.toList());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72612575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档