排序通用链表
本文关键字:链表 排序 | 更新日期: 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方法的参数。