Java 如何使用arraylist访问类中添加其toString的成员

Java 如何使用arraylist访问类中添加其toString的成员,java,arraylist,polymorphism,Java,Arraylist,Polymorphism,我有一个类,比如说CargoShip,它是“星际争霸”的派生类,它实现了IStarcraft接口 我有一个函数公共静态ArrayList getSpacecraftDescriptionsByCommissionYear(ArrayList fleet) 问题:货船必须打印名称、佣金年份等。。 我想做两件事:第一,我想使用每艘船的toString(就像货船上的toString),第二,我想按佣金年排序 问题:将toString添加到arrayList后,我不知道如何访问commissionYea

我有一个类,比如说CargoShip,它是“星际争霸”的派生类,它实现了IStarcraft接口

我有一个函数
公共静态ArrayList getSpacecraftDescriptionsByCommissionYear(ArrayList fleet)

问题:货船必须打印名称、佣金年份等。。 我想做两件事:第一,我想使用每艘船的toString(就像货船上的toString),第二,我想按佣金年排序

问题:将toString添加到arrayList后,我不知道如何访问commissionYear字段

ArrayList<String> strCommissions = new ArrayList<String>();

        for(ISpacecraft flee : fleet)
        {
            strCommissions.add(flee.toString());
        }
        //Collections.sort(//What to write here??//);
        return strCommissions;
}

首先,您可以将列表
车队
复制到新的车队中:

ArrayList<ISpacecraft> objects = new ArrayList<>(fleet);
然后创建字符串列表:

ArrayList<String> strCommissions = new ArrayList<String>();
objects.forEach(o -> strCommissions.add(o.toString()));
ArrayList strCommissions=new ArrayList();
forEach(o->strCommissions.add(o.toString());
因此,您的功能变成:

public static ArrayList<String> getSpacecraftDescriptionsByCommissionYear(ArrayList<ISpacecraft> fleet){
       ArrayList<ISpacecraft> objects = new ArrayList<>(fleet);
       Collections.sort(objects, Comparator.comparingInt(ISpacecraft::getCommissionYear));
       ArrayList<String> strCommissions = new ArrayList<String>();
       objects.forEach(o -> strCommissions.add(o.toString()));
       return strCommissions;
}
公共静态ArrayList getSpacecraftDescriptionsByCommissionYear(ArrayList车队){
ArrayList对象=新的ArrayList(车队);
Collections.sort(objects,Comparator.comparingInt(ISpacecraft::getCommissionYear));
ArrayList strCommissions=新建ArrayList();
forEach(o->strCommissions.add(o.toString());
返回strCommissions;
}
阅读:


您应该实现Comparable并实现compareTo方法,或者如上所述,可以使用Comparator

public int compareTo(CargoShip otherCargoShip) {
    int i = Name .compareTo(other.Name );
    if (i != 0) return i;

    i = CommissionYear.compareTo(other.CommissionYear);
    if (i != 0) return i;

    return Integer.compare(MaximalSpeed , other.MaximalSpeed );
}

当你把它们转换成字符串时,你不能按佣金年排序,因为你只有字符串。我会复制列表,对副本进行排序,然后转换为字符串…如何按佣金年对副本进行排序?因为当我这么做的时候,只会返回佣金年@JonSkeetSee@JonSkeet我不知道在看到链接后如何跟进。让我再次解释一下,每艘船都有自己的(可能超载)构造函数,所以我不能使用新的。第一个问题-如何将所有可用的ship对象添加到“strCommissions”(String ArrayList)中?添加后,如何通过commissionYear对其进行排序?车队是否是列表?是的,您的代码有效。我仍然在阅读比较器的工作原理,我会更新。谢谢你,我的!我很快就会接受你的答案。这就是我正在使用的:好吧,这也是一个很好的链接,但是,我添加了一个链接,在我第一次开始学习比较器时发现它很有用。这个-->
ISpacecraft::getCommissionYear
被称为a,并且更简洁。但是,这是您按照前面提到的
Collections.sort(objects,new Comparator(){@Override public int compare(ISpacecraft o1,ISpacecraft o2){return o1.getCommissionYear()-o2.getCommissionYear();}}进行操作的方式工作完美。我现在需要研究compare函数,因为我没有使用减号,而是尝试使用compareTo,这导致了一个错误。
public static ArrayList<String> getSpacecraftDescriptionsByCommissionYear(ArrayList<ISpacecraft> fleet){
       ArrayList<ISpacecraft> objects = new ArrayList<>(fleet);
       Collections.sort(objects, Comparator.comparingInt(ISpacecraft::getCommissionYear));
       ArrayList<String> strCommissions = new ArrayList<String>();
       objects.forEach(o -> strCommissions.add(o.toString()));
       return strCommissions;
}
public int compareTo(CargoShip otherCargoShip) {
    int i = Name .compareTo(other.Name );
    if (i != 0) return i;

    i = CommissionYear.compareTo(other.CommissionYear);
    if (i != 0) return i;

    return Integer.compare(MaximalSpeed , other.MaximalSpeed );
}