62,614
社区成员
发帖
与我相关
我的任务
分享
public class Sample {
static class User {
String name;
int age;
public User(String name, int age) {this.name=name; this.age=age;}
}
public static void main(String[] args) {
try {
List<User> list = new ArrayList<User>();
list.add(new User("A", 1));
list.add(new User("B", 1));
list.add(new User("C", 1));
list.add(new User("A", 2));
list.add(new User("B", 2));
list.add(new User("B", 4));
list.add(new User("A", 3));
list.add(new User("A", 4));
list.add(new User("A", 7));
list.add(new User("B", 7));
list.add(new User("C", 4));
Comparator<String> keyComp = new Comparator<String>() { //name比较器
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
};
Comparator<User> userComp = new Comparator<User>() { //age比较器
public int compare(User u1, User u2) {
return u1.age - u2.age;
}
};
Map<String, List<User>> map = new HashMap<>(); //按name分组
for (int i=0; i<list.size(); i++) {
User u = list.get(i);
if (!map.containsKey(u.name)) {
map.put(u.name, new ArrayList<>());
}
map.get(u.name).add(u);
}
List<String> keys = new ArrayList<>(map.keySet());
keys.sort(keyComp); //map的key按name排序
for (int i=0; i<keys.size(); i++) {
map.get(keys.get(i)).sort(userComp); //map的value的list按age排序
}
List<User> result = new ArrayList<>(); //排序结果
while (true) {
for (int i=0; i<keys.size(); i++) { //key依次循环
List<User> users = map.get(keys.get(i));
while (users.size()>0) { //key对应的value的list有数据就循环处理
if (result.size()>0) {
User last = result.get(result.size()-1); //上一条数据
User cur = users.get(0); //当前数据
if (last.name.equals(cur.name) && last.age+2 < cur.age) { //直到当前数据不满足排序条件
break;
}
}
result.add(users.remove(0)); //否则就从value的list里移走数据插入到排序结果里
}
}
if (result.size()==list.size()) break; //排序结果件数和排序前件数相同则说明排序结束
}
for (int i=0; i<result.size(); i++) { //打印结果
System.out.printf("name:%s, age:%d\n", result.get(i).name, result.get(i).age);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User u1, User u2) {
int diff = u1.getAge() - u2.getAge();
if (diff >= -2 && diff <= 2) {
return 1;
}
return 0;
}
});
这样只对age排序而已, 没有按相同name排序