排序通用链表

本文关键字:链表 排序 | 更新日期: 2023-09-27 18:18:38

除了排序之外,我已经完成了通用链表中的所有内容。我不知道怎么用IComparable或者我该怎么做因为它是通用的。我甚至不知道我要比较或排序什么?

public class Node<T> : IComparable<T>
{
    private Node<T> next;
    private T item;
}

public int CompareTo( T other )
{
    // TODO: Find out how to do it properly
    throw new NotImplementedException();
}

将其转换为数组,然后对其排序,然后再将其转换回来,这也违反了指令。

排序通用链表

让链表Node对象实现IComparable完全没有意义,原因正是你所描述的。相反,您在链表中使用的类应该实现它。实际上,您可以通过泛型类型约束来要求:

MyClass<T> where T : IComparable<T> {}

完成后,您可以在执行排序时使用T,就好像它IComparable一样。

您应该做的第一件事是阅读排序算法并决定使用哪一种。一旦你这样做了,你可以担心比较你的泛型值。

如果你想遵循框架方法,不要要求你的T实现IComparable<T>.,而是使用Comparer<T>.Default。这种方法允许您编写类来支持用户定义的比较:

public class LinkedList<T>
{
    public void Sort() { this.Sort(Comparer<T>.Default); }
    public void Sort(IComparer<T> comparer)
    {
        //todo: implement
        throw new NotImplementedException();
    }
}

我的这个答案的最初版本有比较器作为类的属性,但这真的是不正确的,因为链表不是一个固有的排序类型。你可能想用一种方式排序一次,然后2秒后用另一种方式排序。因此比较器应该是sort方法的参数。