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

如何对嵌套对象列表进行排序?

商曦
2023-03-14

我用的是Java 8号。我有一份汽车物品清单。我想按特定的顺序对它们进行排序。
每个汽车对象都属于一个模型。我喜欢按型号对汽车对象列表进行排序。排序后的列表应该是按照以下顺序,有车型的轿车SEDAN,然后是宝马,然后是独角兽。

import java.util.ArrayList;
import java.util.List;

enum Model {

    BMW, SEDAN, UNICORN

}

public class Car {

    private Model model;

    private int id;

    public Car(Model model, int id) {
        super();
        this.model = model;
        this.id = id;
    }

    public Model getModel() {
        return model;
    }

    public void setModel(Model model) {
        this.model = model;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public static void main(String[] args) {

        List<Car> l = new ArrayList<Car>();

        Car c1 = new Car(Model.BMW, 1);
        Car c2 = new Car(Model.BMW, 2);
        Car c3 = new Car(Model.SEDAN, 3);
        Car c4 = new Car(Model.SEDAN, 4);
        Car c5 = new Car(Model.SEDAN, 5);
        Car c6 = new Car(Model.UNICORN, 6);
        Car c7 = new Car(Model.BMW, 7);
        Car c8 = new Car(Model.BMW, 8);

        l.add(c1);
        l.add(c2);
        l.add(c3);
        l.add(c4);
        l.add(c5);
        l.add(c6);
        l.add(c7);
        l.add(c8);
    }
}

所以当我打印排序后的列表时,它应该是这样的

[Car [model=SEDAN, id=3],  Car [model=SEDAN, id=4]  ,Car [model=SEDAN, id=5],  [model=BMW, id=1], Car [model=BMW, id=2], Car [model=BMW, id=7], Car [model=BMW, id=8],  Car [model=UNICORN, id=6]]

如何使用自定义比较器在模型枚举上实现这种排序顺序。

如果你能帮忙,我很感激

共有2个答案

赵飞语
2023-03-14

您可以将int值赋给枚举,并根据您想要的首选项为它们赋值。

然后为car对象实现comparable接口,以便使用这些为每个模型分配的int值对其进行排序

代码

import java.util.ArrayList;
import java.util.List;
// assign enum values in ascending order here 
enum Model {
    SEDAN(0),
    BMW(1),
    UNICORN(2);

    private int value;

    private Model(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}
// implement comparable class 
public class Car implements Comparable<Car> {

    private Model model;

    private int id;

    public Car(Model model, int id) {
        super();
        this.model = model;
        this.id = id;
    }

    public Model getModel() {
        return model;
    }

    public void setModel(Model model) {
        this.model = model;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
   // compare Cars by Model int value
    @Override
    public int compareTo(Car otherCar) {
        if (this.getModel().getValue() > otherCar.getModel().getValue())
            return 1;
        else return -1;
    }

    @Override
    public String toString() {
        return "Car{" +
                "model=" + model +
                ", id=" + id +
                '}';
    }
}

public static List<Car> l = new ArrayList<Car>();
Car c1 = new Car(Model.BMW, 1);
Car c2 = new Car(Model.BMW, 2);
Car c3 = new Car(Model.SEDAN, 3);
Car c4 = new Car(Model.SEDAN, 4);
Car c5 = new Car(Model.SEDAN, 5);
Car c6 = new Car(Model.UNICORN, 6);
Car c7 = new Car(Model.BMW, 7);
Car c8 = new Car(Model.BMW, 8);

l.add(c1);
l.add(c2);
l.add(c3);
l.add(c4);
l.add(c5);
l.add(c6);
l.add(c7);
l.add(c8);
l.sort(Car::compareTo);
l;

输出

[Car{model=SEDAN, id=5}, 
Car{model=SEDAN, id=4}, 
Car{model=SEDAN, id=3}, 
Car{model=BMW, id=8},
Car{model=BMW, id=7}, 
Car{model=BMW, id=2}, 
Car{model=BMW, id=1}, 
Car{model=UNICORN, id=6}]
全流觞
2023-03-14

第一种方法

重新排序枚举项,使结果顺序符合您的要求:

enum Model {
    SEDAN, BMW, UNICORN
}

然后您可以按如下方式对您的列表进行排序:

l.sort(Comparator.comparing(Car::getModel));

请注意,枚举值是按照它们在代码中的顺序(即ordinal())进行比较的

第二种方法

为每个枚举项分配一个值:

enum Model {
    SEDAN(0), BMW(1), UNICORN(2);
    final int val;
    Model(int val) { this.val = val; }
}

然后您可以按如下方式对您的列表进行排序:

l.sort(Comparator.comparing((Car car) -> car.getModel().val));
 类似资料:
  • 我是Java流的新手,我只想对我的对象的键进行排序。 所以,我尝试了这样的方法,效果很好 这是根据我想要的分类。 但我得到的结果在

  • 问题内容: 我正在使用以下映射: 文件范例: 我的问题是如何检索此文档并按“日期”对嵌套对象“注释”进行排序?结果: 问题答案: 您需要在inner_hits上对进行排序。这将为您提供所需的输出 我使用的源过滤得到的只有作为将被检索里面,但你能避免,如果你想 是5,因为默认值为3,并且在给定的示例中我们有4个对象。 希望这可以帮助!

  • 问题内容: 这个问题已经在这里有了答案 : 如何根据对象的属性对对象列表进行排序? (8个答案) 1年前关闭。 我有一个看起来像这样的对象列表。 Card(10,’H)在这里不是元组,而是对象。我知道如果列表中的每个项目都是元组形式的,如何对列表进行排序,就像这样, 但我不知道如何对对象列表进行排序。我想按第一个输入值(即Card()中的数字)对列表进行排序 我怎样才能做到这一点? 编辑:这是Ca

  • 我有一个小问题,希望你能帮我解决。 我有一个名为Entity的类,它有几个属性,其中两个属性是id和实用程序: 然后,我在ArrayList中有几个Entity对象,如下所示: 现在,我想根据公用事业实体对列表进行排序。我使用一个定制的比较器,尝试了几种类似我在这里读到的解决方案: 但是在这条线上: 我遇到了以下错误:int不能被解引用,我不知道如何修复它。你们能帮我解决这个问题或者给出另一个解决

  • 我有“MainClass”类的对象列表,它包含“Question”类的对象列表,它包含Option类的对象列表。如何按“Id”对“MainClass”类列表进行排序,以及按“Id”对“Option”类列表进行排序? 假设,

  • 问题内容: 我具有以下数据结构(列表列表) 我希望能够 使用函数对列表重新排序,以便我可以按列表中的每个项目分组。例如,我希望能够按第二列分组(以便所有21列在一起) 使用函数仅显示每个内部列表中的某些值。例如,我想减少此列表,使其仅包含“ 2somename”的第四个字段值 所以列表看起来像这样 问题答案: 对于第一个问题,您应该做的第一件事是使用运算符模块中的itemgetter按第二个字段对