当前位置: 首页 > 知识库问答 >
问题:

使用Comparable和compareTo()对子类的ArrayList进行排序

温嘉玉
2023-03-14

我有一个银行账户程序,实现了一个扩展到支票账户和储蓄账户子类的银行账户超类。

每个账户有四个属性:名字、姓氏、社会保障和余额。

我有一个BankDatabase类,它创建了一个新的ArrayList来存放这些对象。

我想排序这个ArrayList使用比较接口和comareTo()方法。

public interface Comparable<BankAccount>
{

    int compareTo(BankAccount other);       
}

我实现了与我的超类类似的功能

public abstract class BankAccount implements Comparable<BankAccount>

我写了下面的comareTo()方法:

@Override
    public int compareTo(BankAccount other)
    {

        if (this.getBalance() < other.getBalance())
        {
            return -1;
        }

        if (this.getBalance() > other.getBalance())
        {
            return 1;
        }

        return 0;
    }

我在BankAccount超类中创建了一个余额获取器。我试着用平衡代替这个。getBalance()。然后在我的BankDatabase类中,我试图创建一个名为print()的void方法,该方法将按余额对BankAccount对象进行排序并打印它们。

这是我没有问题的地方。下面的代码是我现在拥有的:

void print()
    {

        Collections.sort(database);

        for (BankAccount database1 : database)
        {

            System.out.println(database1);

        }

    }

对于这段代码,我需要使用Comparable和compareTo(),因为它是赋值的一部分。

我已经导入了java。util。java的ArrayList。util。集合和java。util。列表

下面是我的BankDatabase类和创建新支票或储蓄账户的两种方法:

public class BankDatabase
{

    String first;
    String last;
    List <BankAccount> database;

    BankDatabase()
    {

        database = new ArrayList <BankAccount>();

    }

    void createCheckingAccount(String customerName, String ssn, float deposit)
    {

        String[] customerNames = customerName.split(" ");
        first = customerNames[0];
        last = customerNames[1];

        database.add(new CheckingAccount(first, last, ssn, deposit));

    }

    void createSavingsAccount(String customerName, String ssn, float deposit)
    {

        String[] customerNames = customerName.split(" ");
        first = customerNames[0];
        last = customerNames[1];

        database.add(new SavingsAccount(first, last, ssn, deposit));

    }

任何帮助都将不胜感激。我一直在这里浏览其他线程,使用集合似乎很简单,但它总是失败。

我得到的错误之一是:线程“main”java中出现异常。lang.RuntimeException:不可编译的源代码-错误的符号类型:java。util。收藏。分类

谢谢!

共有1个答案

洪和平
2023-03-14

问题在于您的接口声明:

public interface Comparable<BankAccount>
{
    int compareTo(BankAccount other);       
}

您正在定义一个新的可比较的接口,即传递给集合的列表元素。sort方法必须实现java。lang.Comparable,而不仅仅是任何简单名称为Comparable的界面。

解决这个问题的简单方法是删除你的类。

或者,您可以声明该接口扩展了内置类:

public interface Comparable<BankAccount> extends java.lang.Comparable<BankAccount> {
  @Override int compareTo(BankAccount other);
}

但这并没有什么特别的优势,而且让人困惑的是,你自己的界面与一个知名的界面同名。

另一个不太明显的问题是,您定义中的Bank帐户实际上并不引用您定义的Bank帐户类——它是一个类型变量。它没有特别引用任何类型——您可以用T(即可比

 类似资料:
  • 我得到一个错误-“错误:找不到适合排序(ArrayList)的方法。我如何修复这个问题? 多谢了。

  • 我有一个名为map的HashMap,它将字符存储为键,将整数存储为值,然后使用以下代码将其存储到名为entries的ArrayList中: 现在我正在尝试根据整数值而不是键对这些条目进行排序。我试图使用一个lambda表达式来实现比较器接口,但它不起作用。这是我的代码: 以下是我得到的错误: 这一行有多个标记 > 语法错误,插入“)”以完成表达式 类型集合中的方法sort(列表,比较器)不适用于参

  • 问题内容: 在我正在使用的代码下面,可以正常工作并输出名称,但不能使用sort方法。我期望“ Collections.sort(nameFromText);” 按名字的字母顺序对ArrayList进行排序。 我究竟做错了什么? 问题答案: 方法期望要排序的列表元素具有可比性。元素类型应该实现接口,或者您应该使用带有通用实例的重载方法。 在下面的代码中,您不满足上述两个条件。您的类既没有实现,也没有

  • 我试图实现Comparable和compareTo(),但似乎无法实现。我一直在尝试不同的方法,但我真的不明白。我知道我应该实现可比较的接口,并且我需要在使用它之前创建方法(对我来说很奇怪,从python到面向对象编程)。 我希望它能比较两个人的年龄,所以我试着编写如下所示的代码,但似乎我不能使用compareTo()。我收到错误消息:“此方法必须返回int类型”,但在我看来,我只返回1、-1和0

  • 问题内容: 我有一个类Library,它包含一个Book对象数组,我需要根据Book的Title或PageNumber属性对数组进行排序。我不允许问题与Book一起使用Comparable类。您如何建议我对图书馆中的书籍进行排序?写我自己的排序?还是有更简单的方法?如果您需要代码片段,请问! 问题答案: 您可以提供一个用于比较您希望的任何类型的对象,否则。 对于数组和集合,请使用 甚至像TreeS

  • 问题内容: 有人可以给我看一个简单的示例,如何使用新的lambda语法在Java 8中按字母顺序排序。 问题答案: 对于字符串,这将工作