如何对LinkedList<String>进行排序?

5
我需要按照字符串的长度对LinkedList进行排序,但是希望保留相同长度字符串的顺序(不按字典顺序排序)。
示例输入:
this
is
just
a
test

示例输出:

a
is
this
just
test

我正在尝试使用Comparable<LinkedList<String>>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

我该如何纠正这个问题?

4个回答

7

您需要创建一个比较器:

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的比较器(或者Comparable,因为它在这里有相同的作用),您告诉JVM您想要比较不同的列表。
您也可以通过在需要排序的类中实现Comparable来实现您的目标,但是由于String是final的,所以您不能这样做。因此,除了实现一个更简单的Comparator之外,没有其他方法 :)

“Comparator”也可以用于除了对“List”实现进行排序之外的其他情况,例如“TreeSet”和“TreeMap”。 - Brian
是的。它也可以通过Arrays实用类对数组进行排序,以及其他自定义用途。 - enTropy

6
使用Collections.sort(list, comparator)重载方法。你需要一个Comparator<String>,而不是一个Comparator<LinkedList<String>>。请注意,Collections.sort的javadoc保证了稳定排序(保持相等字符串的顺序,相等意味着根据你的比较器相等)。

3
你正在对字符串进行排序,而不是字符串列表。为此,你需要定义一个Comparator<String>来按照它们的长度比较两个字符串,如下所示:
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通常效率较低,应该尽量避免使用。 - Tom Hawtin - tackline

-1

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


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