题目:
User 类有三个成员变量:name,age,birthday;
List中有100个user对象,其中80个不重复,其中20个重复,
要求去除list中重复的user对象,(只要name,age,birthday的内容一致则重复),
并且最后list中的对象按照name ,age,birthday升序排序
解题思路:
1、采用set集合来过滤list中的重复对象(set集是无重复对象的集合)
2、继承comparator接口重写compareTo(Object o1,Object o2)实现客户端排序。
解题前提:
1、在User中重写equals方法和hashcode方法:由于User默认继承与Object对象,它的equals方法比较的是内存地址,即便三个成员变量内容一致的两个user对象在set集合中也是两个不同的对象,故达不到去重效果,所以需要重写user的equals()方法和hashcode()方法,根据成员变量内容来判断相等,这样才能通过set集合达到去重效果。
代码:
定义了一个User类,代表User;定义了一个MyComparator实现Comparator接口实现客户端拍讯;定义一个test类,去重方法在tset类中实现。
User类
import java.util.Date;
public class User {
private String name;
private int age;
private Date birthday;
public User() {
}
public User(String name) {
this.name = name;
}
public User(String name, int age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
……get set方法……
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o instanceof User) return true;
final User user = (User) o;
if (this.name.equals(user.name) && this.age == user.getAge() && this.birthday.equals(user.getBirthday())) {
return true;
}
return false;
}
@Override
public int hashCode() {
int result;
result = (name == null ? 0 : name.hashCode());
result = 29 * result + age;
return result;
}
}
MyComparator类:
import java.util.Comparator;
public class MyComparator implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
/**按照姓名排序*/
if (o1.getName().compareTo(o2.getName())>0)return 1;
if (o1.getName().compareTo(o2.getName())<0)return -1;
/**按照姓名排序*/
if (o1.getAge()>o2.getAge())return 1;
if (o1.getAge()return -1;
/**按照生日排序*/
if (o1.getBirthday().compareTo(o2.getBirthday())>0)return 1;
if (o1.getBirthday().compareTo(o2.getBirthday())<0)return -1;
return 0;
}
}
test类:
public class Test {
private List list = new ArrayList<>();
private String[] names = {"a", "b", "c", "d", "e", "f", "g", "g", "g", "g","e"};//姓名,4个重复
private int[] ages = {1, 2, 3, 4, 5, 6, 7, 7, 7, 7,5}; //年龄,4个重复
public List distinct() {
list = this.getUserObjects(names, ages);//生成10个User对象
System.out.println("list中的对象个数:"+list.size());//输出现在list中对象个数
Set set = new HashSet();//用来过滤重复对象的set集合
List distinctList = new ArrayList<>();//存储set集合中去重的user对象
Iterator iterator = list.iterator();//遍历原list将其对象挨个放入set中
while (iterator.hasNext()) {
set.add(iterator.next());
}
System.out.println("set中的对象个数:"+set.size());//打印现在set集合中对象个数
Iterator iterator1 = set.iterator();
while (iterator1.hasNext()) {
distinctList.add((User) iterator1.next());//set集合中元素放回list集合
}
return distinctList;
}
public List getUserObjects(String[] name, int[] age) {
for (int i = 0; i < names.length; i++) {
list.add(new User(name[i], age[i], new Date()));
}
return list;
}
public static void main(String[] args) {
System.out.println(new Date());
Test test = new Test();
List list = test.distinct();
Collections.sort(list, new MyComparator());//按照自己定义的排序方式对list集合排序
Iterator iterator = list.iterator();
System.out.println("去重之后list中的对象内容:");
while (iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println("姓名:" + user.getName()+" " + "年龄:" + user.getAge()+" " + "生日:" + user.getBirthday());
}
}
}
输出结果:
list中的对象个数:11 //11个和我想构造的个数相同说明有重复对象
set中的对象个数:7 //可以看到已经去除四个相同的对象(3个“g”,1个“e”)
去重之后list中的对象:
姓名:a 年龄:1 生日:Thu Sep 14 09:28:23 CST 2017
姓名:b 年龄:2 生日:Thu Sep 14 09:28:23 CST 2017
姓名:c 年龄:3 生日:Thu Sep 14 09:28:23 CST 2017
姓名:d 年龄:4 生日:Thu Sep 14 09:28:23 CST 2017
姓名:e 年龄:5 生日:Thu Sep 14 09:28:23 CST 2017
姓名:f 年龄:6 生日:Thu Sep 14 09:28:23 CST 2017
姓名:g 年龄:7 生日:Thu Sep 14 09:28:23 CST 2017