案例:
有一个集合List<Double>,现根据集合中元素的数值大小对该集合进行排序
输入:[1, 4, 6, 2, 8, 7]
输出:[8, 7, 6, 4, 2, 1]
实现思路:
1、使用冒泡排序算法
public static List<Integer> sortByDesc(List<Integer> list) {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size() - 1; j++) {
if (list.get(j) < list.get(j + 1)) {
int value = list.get(j);
list.set(j, list.get(j + 1));
list.set(j + 1, value);
}
}
}
return list;
}
输入:[1, 4, 6, 2, 8, 7]
输出:
2、使用Collections的sort方法以及Comparator对象来实现
public static List<Integer> sortByDesc(List<Integer> list) {
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer varOne, Integer varTwo) {
return varTwo.compareTo(varOne);
}
});
return list;
}
这段代码可以使用Lambda表达式来进行简化,如下:
public static List<Integer> sort(List<Integer> list) {
list.sort((varOne, varTwo) -> varTwo.compareTo(varOne));
return list;
}
输入:[1, 4, 6, 2, 8, 7]
输出:
抽取作为公共方法:
可以将上述代码抽取成一个泛型通用方法,对于数值类型的参数都可以适用:
public static <T extends Number> List<T> sortByDesc(List<T> list) {
if (list == null || list.isEmpty()) {
throw new NullPointerException("传入参数为空!!!");
}
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size() - 1; j++) {
BigDecimal numOne = new BigDecimal(String.valueOf(list.get(j)));
BigDecimal numTwo = new BigDecimal(String.valueOf(list.get(j + 1)));
//负数值表示第一个值小于第二个值
if (numOne.compareTo(numTwo) < 0) {
T value = list.get(j);
list.set(j, list.get(j + 1));
list.set(j + 1, value);
}
}
}
return list;
}
public static <T extends Number> List<T> sortByDesc(List<T> list) {
if (Objects.isNull(list)) {
throw new NullPointerException("传入参数为空!!!");
}
Collections.sort(list, (one, two) -> {
BigDecimal numOne = new BigDecimal(one.toString());
BigDecimal numTwo = new BigDecimal(two.toString());
return numTwo.compareTo(numOne);
});
return list;
}