Java中的集合与列表:按字母顺序排序

3
列表是一个有序集合,而集合是无序的。那么为什么这个程序可以使用集合按字母顺序对字符串进行排序,但不能使用列表呢?我理解两者之间的重复部分。
    PrintStream out = System.out;

    List<String> set = new ArrayList<String>();
    String s = "ILLUSIONS";

    for(int i = 0; i< s.length(); i++)
    {
        set.add((new Character(s.charAt(i))).toString());

    }
    out.println(set);

输出:幻觉


    PrintStream out = System.out;

    Set<String> set = new TreeSet<String>();
    String s = "ILLUSIONS";

    for(int i = 0; i< s.length(); i++)
    {
        set.add((new Character(s.charAt(i))).toString());

    }
    out.println(set);

outputs: ILNOSU


1
你是在混淆排序和顺序吗?它们是两个不同的概念 :) - aishwarya
请查看官方JCF文档,它非常详尽,可以回答你所有的问题。 - Adam Arold
3个回答

7

列表按元素索引进行“排序”。这意味着它们保留了元素插入的顺序。集合(一般情况下)不保留这样的顺序。有些例外:

  • TreeSet 是一个特殊的 Set,它以自然“排序”的顺序保留其元素。
  • LinkedHashSet 是一个特殊的 Set,它保留插入顺序。

如果你想对列表进行“排序”,你必须手动执行:

Collections.sort(list);

实际上,通过“排序”列表,您将重新排列所有列表元素的索引。请参阅相关的Javadoc Collections.sort()

@user193113:我认为aishwarya的回答很好地解释了ListSet之间的主要区别... - Lukas Eder

4

当你说一个列表是有序的时,实际上这只是意味着该列表保留了插入元素的顺序,可以按照可预测的顺序检索这些元素。

Set是无序的,其重点在于具有唯一性。TreeSet是SortedSet的一种,除了维护唯一性外,还以排序的方式维护元素。因此你看到的结果是这样的。


1

是的,列表是有序的,这意味着迭代器返回项的顺序是明确定义的(它将按照插入它们的顺序返回项)。如果您希望以不同的顺序(例如按字母顺序)返回项目,则需要显式对列表进行排序:

java.util.Collections.sort(myList);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接