Java 集合的排序值
我正在尝试对集合中的元素进行排序,但到目前为止无法进行排序。 这是我的代码,我正试图这样做Java 集合的排序值,java,collections,Java,Collections,我正在尝试对集合中的元素进行排序,但到目前为止无法进行排序。 这是我的代码,我正试图这样做 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); } pu
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;
}
publicstaticvoidmain(字符串[]args){
Set=newhashset();
设置。添加(“12”);
设置。添加(“15”);
设置。添加(“5”);
列表=分类列表(集合);
}
公共静电
如果您对字符串“12”
、“15”
和“5”
进行排序,则“5”
排在最后,因为“5”
“1”
。i、 e.字符串的自然顺序并不像您期望的那样工作
如果您想在列表中存储字符串,但对它们进行数字排序,那么您需要使用一个比较器来处理这个问题。e、 g
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));
}
});
Collections.sort(列表,新比较器(){
公共整数比较(字符串o1、字符串o2){
整数i1=整数.parseInt(o1);
整数i2=整数.parseInt(o2);
返回(i1>i2-1:(i1==i2?0:1));
}
});
此外,我认为您在Collection
类型之间有点混淆。HashSet
和HashMap
是不同的东西。您需要将一个比较器实例传递给sort方法,否则元素将按其自然顺序排序
有关更多信息,请检查您正在使用默认比较器对集合进行排序
。在这种情况下,这意味着。从词典学上看,“12”排在“15”之前,排在“5”之前
使用集合
:
Set Set=newhashset();
增加(12);
增加(15);
增加(5);
或者使用不同的比较器:
Collections.sort(list, new Comparator<String>() {
public int compare(String a, String b) {
return Integer.parseInt(a) - Integer.parseInt(b);
}
});
Collections.sort(列表,新比较器(){
公共整数比较(字符串a、字符串b){
返回Integer.parseInt(a)-Integer.parseInt(b);
}
});
。你看到的行为是正确的
定义你喜欢的方式
如果您将集合更改为整数而不是使用字符串,它也将按照您预期的方式工作(5作为第一个元素)。使用SortedSet(TreeSet是默认值):
SortedSet set=new TreeSet();
设置。添加(“12”);
设置。添加(“15”);
设置。添加(“5”);
列表=新的ArrayList(集合);
不需要额外的排序代码
哦,我知道你想要不同的排序顺序。向树集提供一个比较器:
new TreeSet<String>(Comparator.comparing(Integer::valueOf));
newtreeset(Comparator.comparing(Integer::valueOf));
现在您的树集将按数字顺序对字符串进行排序(这意味着如果您提供非数字字符串,它将抛出异常)
参考资料:
- Java教程():
- Javadocs:
- Javadocs:
使用整数
包装类而不是字符串,因为它通过实现可比
为您完成了艰巨的工作。然后java.util.Collections.sort(列表)代码>就可以了。一个地图
不是一个集合
。差别很大!如果您想要一个排序集,有没有任何理由不使用排序集?+1。。。虽然:在比较过程中从一个整数减去另一个整数可能会导致下溢;显式比较会更安全。o1==o2
可能会导致非插入字符串的意外结果。使用o1.equals(o2)
(您也可以使用o1.intern()==o2.intern()
,但这太糟糕了)谢谢@seanizer-我不是真的想比较字符串。我在编辑中丢失了对parseInt
的调用。我又修改了。你的返回语句不能简化为returni1.compareTo(i2)代码>?您还可以将该比较器
传递给树集的构造函数
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));