如:
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
uj5u.com熱心網友回復:
Collections.sort(list)方法試試,我記得用這個然后物件重寫比較的方法uj5u.com熱心網友回復:
https://blog.csdn.net/qq_40298231/article/details/109646886,可參考這個博客,實作對物體類物件屬性的排序規則uj5u.com熱心網友回復:
試過了
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排序
uj5u.com熱心網友回復:
你這個排序規則某種意義上來說,很麻煩先按相同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等等
uj5u.com熱心網友回復:
其實也不難第一步按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的資料就是排好序的結果
uj5u.com熱心網友回復:
按照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();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251041.html
標籤:Java SE
