设置的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)); } });
此外,我认为你Collection
types之间有点混合。 HashSet
和HashMap
是不同的东西。
使用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)