【问题标题】:Collection Sort method not working properly on linked list集合排序方法在链表上无法正常工作
【发布时间】:2013-10-20 19:02:32
【问题描述】:

这是我的代码:

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,所以我不确定为什么它似乎找不到方法。

我是编码初学者,所以我的编码词汇量不是太强,所以请多多包涵!

谢谢!

【问题讨论】:

  • CollectionCollections 是两个不同的类。
  • 你是完全正确的 Sotirios!我没有注意到;但是,当我更改方法名称时,还是同样的错误。
  • 不,这是另一个错误。您在ListMerge&lt;String&gt; 中声明的泛型参数正在遮蔽String 类型。
  • 那么我该如何解决这个问题呢?对不起,我只是不明白
  • 我不想给你答案。也许其他人会。通过this tutorial 了解通用类声明的语法。

标签: java sorting collections linked-list


【解决方案1】:

注意返回类型:void sort(List&lt;T&gt; list),它对给定列表进行排序。

编译器需要带有签名LinkedList&lt;String&gt; sort(List&lt;T&gt; list) 的方法,而Collections 类中不存在该方法。

这行是非法的:

newList = Collections.sort(newList);

你可以很容易地解决这个问题:

 Collections.sort(newList);

【讨论】:

  • 你是完全正确的。我应该检查一下。谢谢你的时间!非常感谢
【解决方案2】:

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

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

但是,您可能会发现拥有一个 ListMerger 类会更简单,该类有一个方法“mergeLists”,该方法返回一个 LinkedList 对象。

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);

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

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

【讨论】:

  • 非常感谢!我应该检查方法的返回类型。
  • 只是提个醒.. 我对语法有点模糊。 E 需要“有界”,因此仅限于实现“Comparable”的类。有机会会更新。或者,您可以让 ListMerger 不是通用的,并且只接受 LinkedList 参数。那么您不必担心模板。也许将事物命名为 StringListMerger。
【解决方案3】:

你改成java.util.Collections后的问题如下

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

你在ListMerge&lt;String&gt;中的类型参数,即。 &lt;String&gt; 是参数的简单名称。它与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 了解更多关于泛型类声明的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2023-03-22
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多