Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集合的排序值_Java_Collections - Fatal编程技术网

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