gpt4 book ai didi

java - 对不同的 Java 基元类型进行排序

转载 作者:行者123 更新时间:2023-12-01 17:14:53 31 4
gpt4 key购买 nike

我有一个包含不同 Java 原语的 Java 集合:

List<Object> list = new ArrayList<>();
list.add(100);
list.add(10L);
list.add("KONG")
list.add(102.78);

现在我想将这些不同的类型排序为“自然”顺序,就像 Excel 所做的那样:

10, 100, 102.78, KONG

有谁知道一种简单的方法来实现这种类型的比较器?或者一个包含所有费力的 instanceof 和转换内容的库?

一个好的候选“自然”顺序是首先是数字,然后是按字母顺序排列的字符串,就像上面的示例一样。

最佳答案

只需将它们全部转换为字符串(使用 toString(),在需要的地方进行框,确保正确处理 null),然后对它们的字符串表示形式进行排序。我认为这是最简单的方法。

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;

public class Test53 {

public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();
list.add(null);
list.add("");
list.add(null);
list.add("5");
list.add(5);
list.add("2");
list.add(20);
list.add(100);
list.add(10L);
list.add("9");
list.add("KONG");
list.add("KONGGG");
list.add(102.78);
Collections.sort(list, new SpecialComparator());
System.out.println(Arrays.toString(list.toArray()));
}

}

class SpecialComparator implements Comparator<Object> {

public int compare(Object o1, Object o2) {
if (o1 == null && o2 != null) return -1;
else if (o1 != null && o2 == null) return 1;
else if (o1 == null && o2 == null) return 0;

else {
Class<?> c1 = o1.getClass();
Class<?> c2 = o2.getClass();

if (Number.class.isAssignableFrom(c1) && String.class.isAssignableFrom(c2)){
return -1;
}else if (Number.class.isAssignableFrom(c2) && String.class.isAssignableFrom(c1)){
return 1;
}
else if (Number.class.isAssignableFrom(o1.getClass()) && Number.class.isAssignableFrom(o2.getClass())){
double d = ((Number)o1).doubleValue() - ((Number)o2).doubleValue();
if (Math.abs(d)<1e-8) return 0;
else return (d<0) ? -1 : 1;
}
else {
return o1.toString().compareTo(o2.toString());
}
}
}
}

关于java - 对不同的 Java 基元类型进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22674750/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com