对集的值进行排序

2022-09-01 02:17:25

我试图对一个集合的元素进行排序,但到目前为止还无法做到。这是我正在尝试做的代码

public static void main(String [] args){
    Set<String> set=new HashSet<String>();
    set.add("12");
    set.add("15");
    set.add("5");
    List<String> list=asSortedList(set);
}

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  Collections.sort(list);
  return list;
}

但是这种或其他方式不起作用,因为它一直以来都给了我与它们相同的顺序,它们被填充了12,15,5


答案 1

使用排序集(树集是默认的):

SortedSet<String> set=new TreeSet<String>();
set.add("12");
set.add("15");
set.add("5");
List<String> list=new ArrayList<String>(set);

无需额外的排序代码。

哦,我看到你想要一个不同的排序顺序。为树集提供比较器:

new TreeSet<String>(Comparator.comparing(Integer::valueOf));

现在,您的 TreeSet 将按数字顺序对字符串进行排序(这意味着如果您提供非数字字符串,它将引发异常)

参考:


答案 2

如果对字符串进行排序,则排在最后,因为 > 。即,字符串的自然排序不符合您的预期。"12""15""5""5""5""1"

如果要将字符串存储在列表中,但按数字顺序对它们进行排序,则需要使用处理此问题的比较器。例如:

Collections.sort(list, new Comparator<String>() {
    public int compare(String o1, String o2) {
        Integer i1 = Integer.parseInt(o1);
        Integer i2 = Integer.parseInt(o2);
        return (i1 > i2 ? -1 : (i1 == i2 ? 0 : 1));
    }
});

另外,我认为你在类型之间有点混淆。A 和 a 是两回事。CollectionHashSetHashMap