设置的sorting值

我正在尝试对一组元素进行sorting,但无法做到这一点。 这是我正在尝试做的代码

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

如果对string"12""15""5"进行sorting,那么"5"最后会因为"5" > "1" 。 即string的自然顺序不符合您的期望。

如果你想在你的列表中存储string,但数字sorting,那么你将需要使用比较器来处理这个。 例如

 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)); } }); 

此外,我认为你Collectiontypes之间有点混合。 HashSetHashMap是不同的东西。

使用SortedSet(TreeSet是默认的):

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

没有额外的sorting代码需要。

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

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

现在你的TreeSet将按string的顺序sorting(这意味着如果你提供非数字string,它将会抛出exception)

参考:

  • Java教程( 集合跟踪 ):
    • 对象sorting
    • SortedSet接口
  • Javadocs: TreeSet
  • Javadocs: Comparator

你使用默认的比较器来sorting一个Set<String> 。 在这种情况下,这意味着词典顺序 。 按字母顺序, "12""15"之前,在"5"之前。

使用Set<Integer>

 Set<Integer> set=new HashSet<Integer>(); set.add(12); set.add(15); set.add(5); 

或者使用不同的比较器:

 Collections.sort(list, new Comparator<String>() { public int compare(String a, String b) { return Integer.parseInt(a) - Integer.parseInt(b); } }); 

使用Integer包装类而不是String,因为它通过实现Comparable<Integer>为您做了很大的工作。 然后java.util.Collections.sort(list); 会做的伎俩。

string按字典顺序sorting 。 你看到的行为是正确的。

定义你自己的比较器来sortingstring,但是你喜欢。

如果您将集合更改为Integer,而不是使用String,那么它也会以您期望的方式工作(5作为第一个元素)。

您需要将Comparator实例传递给sorting方法,否则元素将按自然顺序sorting。

有关更多信息,请检查Collections.sort(List,Comparator)