初学者求助, 对 LIST 重新排序

Forosoft 2021-01-21 03:50:44
如:
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));

想要输出结果:
name : A, age : 1
name : A, age : 2
name : A, age : 3
name : A, age : 4
name : B, age : 1
name : B, age : 2
name : B, age : 4
name : C, age : 1
name : A, age : 7
name : B, age : 7
name : C, age : 4


说明: 按原list顺序, 重新排序, 先按相同name, 再按age相差2以内(最后一个与下一个相比), jdk7
...全文
251 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2021-01-21
  • 打赏
  • 举报
回复
按照5L的思路,给你写段sample代码

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();
}
}
}
qybao 2021-01-21
  • 打赏
  • 举报
回复
其实也不难 第一步按name分组,每组按age排序,存入map(key:name,value:list<user>->按age排序) 第二步,map的key排序 第三步,按map的key顺序依次循环,先取第一个key的value的list<user>数据,插入新的排序结果list,直到age相差大于2就取下一个key的value的list<user>的数据插入list,直到age相差2就再取下一个key的value的list<user>数据,依次类推,key走到最后一个就返回第一个key,如此反复循环,直到map的value的list<user>都被remove完,排序结果list的数据就是排好序的结果
夜白宋 2021-01-21
  • 打赏
  • 举报
回复
你这个排序规则某种意义上来说,很麻烦 先按相同name, 再按age相差2以内 <--排序步骤--> 写成中文规则就是先排A,因为A4和A7中间差了3所以不排A7 A1, A2, A3, A4 再排B A1, A2, A3, A4,B1,B2,B4,因为B4和B7中间差了3所以不排B7 再排C A1, A2, A3, A4,B1,B2,B4,C1,因为C1和C4中间差了3所以不排C4 <--排序步骤--> 再按上面的排序步骤排一次A7,B7,C4 这就涉及到了递归,因为这些参数不是固定的,如果还有其他参数就必须要递归,比如多了A11,B11,C7等等
Forosoft 2021-01-21
  • 打赏
  • 举报
回复
引用 1 楼 liushuo9999 的回复:
Collections.sort(list)方法试试,我记得用这个然后对象重写比较的方法
试过了


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排序
源者鬼道 2021-01-21
  • 打赏
  • 举报
回复
https://blog.csdn.net/qq_40298231/article/details/109646886,可参考这个博客,实现对实体类对象属性的排序规则
liushuo9999 2021-01-21
  • 打赏
  • 举报
回复
Collections.sort(list)方法试试,我记得用这个然后对象重写比较的方法

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧