我用的是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]]
如何使用自定义比较器在模型枚举上实现这种排序顺序。
如果你能帮忙,我很感激
您可以将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}]
第一种方法
重新排序枚举项,使结果顺序符合您的要求:
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按第二个字段对