5

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

样本输入:

this
is
just
a
test

样本输出:

a
is
this
just
test

我正在尝试使用 aComparable<LinkedList<String>>和 acompareTo方法来做到这一点,但我没有得到正确的输出(我的仍然按字典顺序排序)

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

4 回答 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 的比较器(或可比较的,因为它在这里工作的目的相同),您告诉 JVM 是您想要比较不同的 List。

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

于 2012-09-28T15:18:18.890 回答
6

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

于 2012-09-28T15:17:56.883 回答
3

您正在排序字符串,而不是字符串列表。为此,您需要定义 aComparator<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());

另请注意,排序 aLinkedList效率非常低,您应该使用 aArrayList代替。

于 2012-09-28T15:20:17.317 回答
-1

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

于 2012-09-28T15:17:56.177 回答