【问题标题】:How to sort LinkedList<String>?如何对 LinkedList<String> 进行排序?
【发布时间】:2012-09-20 11:58:00
【问题描述】:

我需要按字符串的长度对 LinkedList 的字符串进行排序,但希望保持相同长度字符串的顺序(不按字典顺序排序)。

示例输入:

this
is
just
a
test

样本输出:

a
is
this
just
test

我正在尝试使用 Comparable&lt;LinkedList&lt;String&gt;&gt;compareTo 方法执行此操作,但我没有得到正确的输出(我的仍然按字典顺序排序)

public class Q3_sorting implements Comparable<LinkedList<String>> {
    Scanner keyboardScanner = null;
    LinkedList<String> fileList = new LinkedList<String>();

// [...] 这里有一些代码

public int compareTo(LinkedList<String> o) {
        // TODO Auto-generated method stub
        o = fileList;

        for (int i = 0; i < fileList.size() -1; i++) {
            if (fileList.get(i).length() == o.get(i+1).length()) {
                return 0;
            }
            if (fileList.get(i).length() > o.get(i+1).length()) {
                return -1;
            }
            if (fileList.get(i).length() < o.get(i+1).length()) {
                return 1;
            }

        }

然后我使用
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList); 在我的主要方法中。然后我将列表打印出来......

但我将其作为输出:

a
is
just
test
this

我该如何解决这个问题?

【问题讨论】:

    标签: java sorting linked-list comparable


    【解决方案1】:

    你应该创建一个比较器:

    public class Q3_sorting implements Comparator<String> {
    public int compare(String a, String b) {
     return a.length() - b.length();
    }
    

    然后用方法排序:

    Collections.sort(list, new Q3_sorting());
    

    请注意,您要做的是对列表中的字符串进行排序。通过实现 List 的比较器(或可比较的,因为它在这里工作的目的相同)你告诉 JVM 是你想要比较不同的 List。

    您也可以通过在类中实现 Comparable 来实现您的目标以进行排序,但只要 String 是最终的,您就无法实现,因此您无法扩展。因此,除了实现比较器之外别无他法,这也更简单:)

    【讨论】:

    • Comparator 也可以用于对List 实现进行排序,例如TreeSetTreeMap
    • 是的。它也可用于通过 Arrays 实用程序类在自定义用途中对数组进行排序。
    【解决方案2】:

    您正在排序字符串,而不是字符串列表。为此,您需要定义一个Comparator&lt;String&gt; 来比较两个字符串的长度,如下所示:

    public class ByLength implements Comparator<String> {
      @Override
      public int compare(String a, String b) {
        return a.length() - b.length();
      }
    }
    

    然后,要对列表进行排序,您需要调用:

    Collections.sort(sort.fileList, new ByLength());
    

    另请注意,对LinkedList 进行排序非常低效,您应该改用ArrayList

    【讨论】:

    • Collections.sort 的任何合理实现都会在排序前将数据复制到数组中,然后再复制回。但是,LinkedList 通常效率低下,通常应避免使用。
    【解决方案3】:

    使用Collections.sort(list, comparator) 重载。你需要Comparator&lt;String&gt; 而不是Comparator&lt;LinkedList&lt;String&gt;&gt;。请注意,Collections.sort 的 javadoc 保证了稳定的排序(保持相等字符串的顺序,根据您的比较器相等均值相等)。

    【讨论】:

      【解决方案4】:

      不幸的是,字符串没有一个属性来表示它们在链表中的位置。因此,您将需要创建一个跟踪该信息的自定义数据对象。要么为链表编写你自己的自定义排序方法,然后调用它而不是 Collections.sort()。

      【讨论】:

        猜你喜欢
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 2016-08-28
        • 2017-11-02
        • 1970-01-01
        相关资源
        最近更新 更多