java8写一个按复数个key进行排序的共通方法
时间: 2024-05-14 12:14:59 浏览: 179
以下是一种按复数个键进行排序的通用方法的实现:
```java
public static <T> List<T> sort(List<T> list, Function<T, List<Comparable>> keyExtractor) {
Comparator<T> comparator = Comparator.comparing((T t) -> keyExtractor.apply(t).size());
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
List<Comparable> key1 = keyExtractor.apply(list.get(i));
List<Comparable> key2 = keyExtractor.apply(list.get(j));
int cmp = 0;
for (int k = 0; k < Math.min(key1.size(), key2.size()); k++) {
cmp = key1.get(k).compareTo(key2.get(k));
if (cmp != 0) {
break;
}
}
if (cmp == 0 && key1.size() != key2.size()) {
cmp = key1.size() < key2.size() ? -1 : 1;
}
if (cmp > 0) {
T temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
}
return list;
}
```
使用示例:
```java
List<List<Integer>> keys = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3),
Arrays.asList(1, 2, 3),
Arrays.asList(2, 3),
Arrays.asList(1),
Arrays.asList(2),
Arrays.asList(1, 3)
);
List<String> values = Arrays.asList(
"a", "b", "c", "d", "e", "f", "g"
);
List<String> sorted = sort(values, v -> keys.get(values.indexOf(v)));
System.out.println(sorted); // [e, f, b, a, d, g, c]
```
在这个示例中,我们有一个具有复数个键的映射关系,其中键是一个整数列表,值是一个字符串。我们可以使用 `sort` 方法对值进行排序,传递一个 `keyExtractor` 函数,该函数从值中提取对应的键列表。该方法会根据键列表的大小进行排序,如果键列表的大小相同,则会按照键列表中的元素进行排序。在这个示例中,我们使用 `values.indexOf(v)` 来查找值在值列表中的索引,然后从 `keys` 列表中获取对应的键列表。最后,我们将排序后的值列表打印出来。
阅读全文