public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [age=" + age + "]";
}
}
public static void main(String[] args) {
TreeSet<User> set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((User) o2).getAge() - (((User) o1).getAge());
}
});
User user1 = new User();
user1.setAge(10);
User user2 = new User();
user2.setAge(20);
User user3 = new User();
user3.setAge(10);
set.add(user1);
set.add(user2);
set.add(user3);
System.out.println(set.size());
}
你认为最终输出的size是多少?3还是2呢?
其实是2,因为两个age相等,compare(Object o1, Object o2) 方法返回值为0,所以认为是重复元素,没有将user3加入到集合.
我一直以为去重复是通过hashcode 和 equals方法来判断的,现在看来不是的.
这个方法排序是按compare(Object o1, Object o2)返回值从小到大排序, 如果返回值是0则认为两个对象是重复的(而不是并列排序),如果想要让其认为两个对象是并列的, 那么不应该返回0,而是返回非0的数字.
解决办法
1.在计算差值之前判断两个age是否相等,相等则返回非0的数字
public int compare(Object o1, Object o2) {
if (((User) o2).getAge() == (((User) o1).getAge())) {
return 1;
}
return ((User) o2).getAge() - (((User) o1).getAge());
}
上述修改会影响最终排序吗?不会!事例如下:
public static void main(String[] args) {
TreeSet<User> set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (((User) o2).getAge() == (((User) o1).getAge())) {
return 1;
}
return ((User) o2).getAge() - (((User) o1).getAge());
}
});
User user1 = new User();
user1.setAge(10);
User user2 = new User();
user2.setAge(20);
User user3 = new User();
user3.setAge(10);
User user4 = new User();
user4.setAge(15);
User user5 = new User();
user5.setAge(15);
User user6 = new User();
user6.setAge(12);
User user7 = new User();
user7.setAge(12);
set.add(user1);
set.add(user2);
set.add(user3);
set.add(user4);
set.add(user5);
set.add(user6);
set.add(user7);
System.out.println(set);
System.out.println(set.size());
}
打印结果如下:
[User [age=20], User [age=15], User [age=15], User [age=12], User [age=12], User [age=10], User [age=10]]
7
2.用Collections.sort排序
public static void main(String[] args) {
List<User> list = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
User user2 = new User();
user2.setAge(20);
User user3 = new User();
user3.setAge(10);
list.add(user1);
list.add(user2);
list.add(user3);
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((User) o2).getAge() - (((User) o1).getAge());
}
});
System.out.println(list);
}
打印如下:
[User [age=20], User [age=10], User [age=10]]
分享到:
相关推荐
程序实现时间排序Comparator
Java中Comparator接口的用法 对集合排序的例子 Comparator
java排序Comparator和Comparable
NULL 博文链接:https://elvin-chu.iteye.com/blog/1979500
List对象集合的排序:比较器Comparator
可以通过两种方式自定义对象的属性大小进行比较,对一个list或数组对根据属性排序一个list或数组
NULL 博文链接:https://singhoo.iteye.com/blog/1704428
主要介绍了JAVA使用Comparator接口实现自定义排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
主要介绍了Java8 Comparator排序方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java Comparator 用法 例子java Comparator 用法 例子java Comparator 用法 例子java Comparator 用法 例子
在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是Baeldung上的“Java ——...
例如,如果程序循环遍历数组中的所有元素,JVM 就可以优化数组的边界检查,使循环更快,展开循环能提供额外的加速。但如果循环是为了找到特定元素,那目前还没有什么优化的办法,使得遍历数组和采用HashMap 的版本...
定制排序:在创建TreeSet集合对象时,并提供一个Comparator接口实现类对象与该TreeSet集合关联, 由Comparator实现类对象负责集合元素的排序逻辑。 // 自定义比较器 class MyTreeSetCompartor implements...
Comparable&Comparator区别,看完就明白了
文件比對工具,可以生成比對報告,支持itd、doc和ttx。
comparator接口与Comparable接口的区别
4. * 汉字按照拼音排序的比较器 5. * @author KennyLee 2009-2-23 10:08:59 6. * 7. */ 8.public class PinyinComparator implements Comparator<Object> { 9. public int compare(Object o1, Object o2) { 10...
java的Comparator和Comparable
简单的用commons的jar包,运用其中Comparator的方法,希望对你有所帮助。