[英]Java TreeSet Comparator
我有一个包含以下字段的Vehicle类:baseVehicleId,subModelId,notes和partNo
如果是相同的baseVehicleId,subModelId和partNo,我希望保留最长注释的对象(并删除其他注释)
我有这个:
Comparator<Vehicle> comparator = new Comparator<Vehicle>() {
@Override
public int compare(Vehicle a, Vehicle b) {
if(a.baseVehicleId().equals(b.baseVehicleId()) && String.valueOf(a.subModelId ()).equals(String.valueOf(b.subModelId ()))
&& String.valueOf(a.partNo ()).equals(String.valueOf(b.partNo ()))
))
return a.getOurnotes().compareTo(b.getOurnotes());
// not good I know
return 1;
}
};
TreeSet<Vehicle> treeSet = new TreeSet<Vehicle>(comparator);
我如何修改此代码:/? 因此,例如,如果我所有字段均相等且注释的长度较大,则删除其他对象。
比较器的工作只是说两个对象中的哪个先出现-在比较过程中没有机制可以操纵基础集合。 我认为您可能会以一种稍微不同的方式来考虑:在将对象添加到集合之前执行过滤逻辑。
为了简单起见,我建议仅使用标准列表,例如ArrayList
。 另外,您还需要重写Vehicle类中的equals()
方法,如果两个Vehicle共享相同的ID和部件号,则该方法返回true
。
在添加新车辆时,您可以执行以下操作:
int vehicleIndex = myvehicles.indexOf(vehicle) // -1 if missing, otherwise 0 or greater to represent the index position
if (vehicleIndex == -1) {
// No item in the list shares the ids/model/part numbers so can add
myvehicles.add(vehicle)
} else {
// There's another similar vehicle, better compare their notes:
Vehicle existingVehicle = myvehicles.get(vehicleIndex); // retrieve the object from list so that we can compare it
// check if the new vehicle has longer notes
if (vehicle.getOurNotes().length > existingVehicle.getOurNotes().length) {
// if it does, remove the old one from the list
myvehicles.remove(vehicleIndex);
// and add the new one. Effectively we've done a replacement
myvehicles.add(vehicle)
}
}
显然,它不会自动排序,但是您可以通过运行还接受Comparator的Collections.sort()方法添加一批商品之后执行此操作,但这一次您的比较器现在可以专注于详细说明排序的特定任务,因为您知道该列表已预先过滤,因此您不必担心要过滤掉项目。
只需遍历集合,并使用它删除所有不符合您要求的it.remove()
。
您可能还需要查看Java 8集合功能,该功能将允许您执行诸如过滤集合之类的事情,因为这也将满足您的需求。
我认为你应该使用该方法
maximum = Collections.max(collection, comparator);
用于搜索最多的元素,然后删除其他带有
collection.remove();
在比较器内部,您不能从集合中删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.