繁体   English   中英

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

[英]How to sort LinkedList<String>?

我需要按字符串的长度对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

我该如何纠正这个问题?

你应该创建一个比较器:

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中的字符串进行排序。 通过实现List的比较器(或类似的,因为它在这里工作的目的相同),你告诉JVM的是你要比较不同的List。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM