需求:某一个类对象放入一个集合时,就按照类对象的参数(或者自定义的功能)自动排序,使用的时候不用另外调用集合的sort函数。
可以实现此功能的集合: TreeSet ,TreeMap。
原理:这两个集合提供了相应的构造函数:
TreeSet
(Comparator<?super E> comparator)
TreeMap
(Comparator<?super K> comparator)
举例:
Set<HomeAutodeviceObjectNew>testSet = new TreeSet<HomeAutodeviceObjectNew>(
new StringSizeComparator());
classStringSizeComparator implements Comparator<HomeAutodeviceObjectNew>{
@Override
public intcompare(HomeAutodeviceObjectNew arg0, HomeAutodeviceObjectNew arg1) {
if((arg0.GetArributeValue(arg0.GetSortClusterID(), arg0.GetSortAttrID()) - arg1
.GetArributeValue(arg1.GetSortClusterID(), arg1.GetSortAttrID())) > 0)
return 1;
else if((arg0.GetArributeValue(arg0.GetSortClusterID(), arg0.GetSortAttrID()) - arg1
.GetArributeValue(arg1.GetSortClusterID(), arg1.GetSortAttrID())) < 0)
return -1;
return 0;
}
验证方法:
Iterator<HomeAutodeviceObjectNew>it = testSet.iterator();
while (it.hasNext()) {
HomeAutodeviceObjectNew tempdevice = it.next();
System.out.println(tempdevice.GetArributeValue(tempdevice.GetSortClusterID(),
tempdevice.GetSortAttrID()) + "..");
}
结果:按照属性的value值进行从小到大的排序。
注意:Set会删除重复的对象,如果compare 的return值为0,则会认为是同一个对象。
如果确实需要将数据相等的对象也放在set里,可以修改Comparator类:
classStringSizeComparator implements Comparator<HomeAutodeviceObjectNew>{
@Override
public intcompare(HomeAutodeviceObjectNew arg0, HomeAutodeviceObjectNew arg1) {
if((arg0.GetArributeValue(arg0.GetSortClusterID(), arg0.GetSortAttrID()) - arg1
.GetArributeValue(arg1.GetSortClusterID(), arg1.GetSortAttrID())) >= 0)
return 1;
else if((arg0.GetArributeValue(arg0.GetSortClusterID(), arg0.GetSortAttrID()) - arg1
.GetArributeValue(arg1.GetSortClusterID(), arg1.GetSortAttrID())) < 0)
return -1;
return 0;
}