Java TreeSet Comparator

时间:2014-03-17 08:51:29

标签: java comparator comparable

我有一个带有字段的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);

如何修改此代码:/? 因此,例如,如果我将所有字段都相等并且注释的长度更大,则删除其他对象。

3 个答案:

答案 0 :(得分:1)

比较器的工作只是说两个对象中的哪一个首先出现 - 在比较过程中没有机制来操纵底层集合。我想您会想要以稍微不同的方式考虑这个问题:在将对象添加到集合之前执行过滤逻辑。

我建议只使用标准列表,为了简单起见,请说ArrayList。此外,如果两辆车辆共享相同的ID和部件号,您还需要覆盖Vehicle类中的equals()方法,该方法返回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)
    }
}

显然它没有自动排序,但你可以通过运行同时接受比较器的Collections.sort()方法添加一批项目后再这样做,但这次比较器可以专注于详细说明排序的特定任务您知道该列表已预先过滤,因此您不必担心尝试过滤项目。

答案 1 :(得分:0)

只需循环浏览集合,并使用it.remove()删除所有不符合您要求的内容。

您可能还希望查看Java 8集合功能,该功能允许您执行过滤集合的操作,因为它也可以执行您正在查找的内容。

答案 2 :(得分:0)

我认为你应该使用方法

maximum = Collections.max(collection, comparator);

搜索最大元素,然后用

删除其他元素
collection.remove();

在比较器内部,您无法从集合中删除。