Java:根据作为属性的字符串列表对列表对象进行排序
我有一个场景,我有一个对象列表,比如说Java:根据作为属性的字符串列表对列表对象进行排序,java,sorting,Java,Sorting,我有一个场景,我有一个对象列表,比如说list。每个车辆对象都有另一个对象的列表,例如组。因此车辆对象有一个名为组的属性,它是一个列表 基本上,结构是这样的: public class Vehicle { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer wuid; private String description; @ManyToMany
list
。每个车辆
对象都有另一个对象的列表,例如组
。因此车辆
对象有一个名为组
的属性,它是一个列表
基本上,结构是这样的:
public class Vehicle {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer wuid;
private String description;
@ManyToMany
@JoinTable(
name="wuclassification"
, joinColumns={
@JoinColumn(name="wuid")
}
, inverseJoinColumns={
@JoinColumn(name="classid")
}
)
private List<Group> groups;
}
现在我有了一个Vehicle
对象列表和Group
对象列表。是否有一种方法可以根据具有名称属性的组对象列表对工作单元对象进行排序
例如,假设我有一个Vehicle
对象列表,其中包含自行车、汽车和卡车。
然后,该车辆的组列表及其名称为:
Bike : ['short distance','bike taxi']
Car : ['goods career','long distance','short distance','taxi']
Truck : ['goods carrier','long distance']
因此,根据组列表对其进行排序应如下所示:
Truck : ['goods carrier','long distance']
Car : ['goods career','long distance','short distance','taxi']
Bike : ['short distance','bike taxi']
我从这个链接中跟踪了排序列表的这个链接:
但我无法在这种情况下应用类似的方法。如何实现排序?非常感谢您的帮助和提前感谢。您可以创建一个自定义的
比较器来比较列表中相应索引处的元素
vehicles.sort((a,b)->{
List<Group> aGroups = a.getGroups(), bGroups = b.getGroups();
for(int i = 0; i < Math.min(aGroups.size(), bGroups.size()); i++){
int cmp = aGroups.get(i).getName().compareTo(bGroups.get(i).getName());
if(cmp != 0) return cmp;
}
return Integer.compare(aGroups.size(), bGroups.size());
});
车辆。分类((a,b)->{
List aGroups=a.getGroups(),bGroups=b.getGroups();
对于(int i=0;i
您可以创建一个自定义的比较器
来比较列表中相应索引处的元素
vehicles.sort((a,b)->{
List<Group> aGroups = a.getGroups(), bGroups = b.getGroups();
for(int i = 0; i < Math.min(aGroups.size(), bGroups.size()); i++){
int cmp = aGroups.get(i).getName().compareTo(bGroups.get(i).getName());
if(cmp != 0) return cmp;
}
return Integer.compare(aGroups.size(), bGroups.size());
});
车辆。分类((a,b)->{
List aGroups=a.getGroups(),bGroups=b.getGroups();
对于(int i=0;i
添加另一种选择:我将创建一个函数,该函数获取组列表并通过连接组名返回字符串,然后创建一个比较器,比较上述函数返回的字符串。比如:
Function<List<Group>,String> extractGroupNames = list -> list.stream()
.map(Group::getName)
.collect(Collectors.joining());
Comparator<Vehicle> byGroupNames = (v1,v2) -> extractGroupNames.apply(v1.getGroups())
.compareTo(extractGroupNames.apply(v2.getGroups()));
或者如果你需要相反的顺序
vehicles.sort(byGroupNames.reversed());
要添加另一种选择:我将创建一个函数,该函数获取组列表并通过连接组的名称返回字符串,然后我将创建一个比较器来比较所述函数返回的字符串。比如:
Function<List<Group>,String> extractGroupNames = list -> list.stream()
.map(Group::getName)
.collect(Collectors.joining());
Comparator<Vehicle> byGroupNames = (v1,v2) -> extractGroupNames.apply(v1.getGroups())
.compareTo(extractGroupNames.apply(v2.getGroups()));
或者如果你需要相反的顺序
vehicles.sort(byGroupNames.reversed());
你有字段的getter吗?逻辑是什么?为什么卡车要比汽车或自行车先分类?是的,我要,但我只是想在这里展示一个非常基本的类的结构。@厄立特里亚的要求是,我们希望按照车辆列表中组名的字母顺序对结果进行排序。因此,具有相同组列表但顺序不同的两辆车被认为是不相等的。您有字段的getter吗?什么这是逻辑吗?为什么卡车要比汽车或自行车先分类?是的,我要,但我只是想在这里展示一个非常基本的类结构。@厄立特里亚要求我们按照车辆列表中的组名字母顺序对结果进行排序。因此,具有相同组列表但顺序不同的两辆车辆被视为不相等?