Collection Sort方法在链表上无法正常工作

时间:2013-10-20 19:02:32

标签: java sorting collections linked-list

这是我的代码:

import java.util.Collections;
import java.util.*;
public class ListMerge<String> extends LinkedList<String>
{
    public LinkedList<String> mergeLists(LinkedList<String> one, LinkedList<String> two)
    {
        LinkedList<String> newList = new LinkedList<String>(); 
        newList.addAll(one); 
        newList.addAll(two); 
        newList = Collections.sort(newList); 

        return newList; 
    }  
}

我收到错误“找不到符号 - 方法排序(java.util.LinkedList),我完全不知道为什么它不起作用。我已经导入了集合类并在内联编码中我打电话给Collections,所以我不确定为什么它似乎找不到这个方法。

我是编码的初学者,所以我的编码词汇量不是太强,所以请容纳!

谢谢!

3 个答案:

答案 0 :(得分:3)

注意返回类型:void sort(List<T> list),它会对给定的列表进行排序。

编译器需要具有签名LinkedList<String> sort(List<T> list)的方法,该方法在Collections类中不存在。

这一行是非法的:

newList = Collections.sort(newList);

你可以轻松解决这个问题:

 Collections.sort(newList);

答案 1 :(得分:0)

如果您打算扩展LinkedList,则必须扩展泛型类“LinkedList ...您不能扩展具有指定类型的泛型类的版本:”LinkedList“。您只需指定泛型类模板参数“使用String,例如”当您实例化它的实例时

LinkedList<String> list = new LinkedList<String>()

然而,您可能会发现使用ListMerger类更简单,该类具有返回LinkedList对象的方法“mergeLists”。

public class ListMerger<E extends Comparable>
{
    public LinkedList<E> mergeLists(LinkedList<E> one, LinkedList<E> two)
    {
        LinkedList<E> newList = new LinkedList<E>(); 
        newList.addAll(one); 
        newList.addAll(two); 
        Collections.sort(newList);

        return newList; 
    }  
}

正如其他人所说,是的,Collections.sort方法会修改您输入的列表。它不会返回它的排序副本。那么看看我是如何在我的代码中完成的。然后,您需要做的就是获得合并的LinkedList:

ListMerger<String> merger = new ListMerger<String>();
LinkedList<String> mergedList = merger.mergeLists(one, two);

注意我在使用泛型类时如何指定“String”。没有定义它。哦,注意我将名称从ListMerge更改为ListMerger。我猜是个人喜好。

编辑:更新了示例,要求E为“可比较”。这样,Collections.sort()将接受它。

答案 2 :(得分:0)

更改为java.util.Collections后的问题如下

                                                  v this is a type argument
public class ListMerge<String> extends LinkedList<String>
                       ^ this is a type parameter

ListMerge<String>中的类型参数,即。 <String>是参数的简单名称。它与java.lang.String无关。因此you are obscuring类型为java.lang.String

这可能实际上是你想要的,即。您计划让ListMerge适用于所有类型,相当于

public class ListMerge<T> extends LinkedList<T>

如果不是,那么你想要的是

public class ListMerge extends LinkedList<String>

浏览official Java generics tutorial以了解有关泛型类声明语法的更多信息。