我创建了一个类来在数组上实现QuickSort算法。这是类的构造函数和变量:
public class QuickSort
{
int[] numbers;
public QuickSort(int[] input) {
numbers = input;
Console.WriteLine("QuickSort created!");
}
但是我想将它用于其他类型的数组,比如float。 如何声明该类,以便它可以将任何类型的数组作为输入? 感谢
答案 0 :(得分:3)
这个问题比看起来更难。
首先,这里已经有两个答案说使用泛型。
对于给定的代码示例,它们是100%正确的,使用泛型。
但仅凭这一点并不能解释如何继续下去。
首先,使用泛型将使您能够编写将接受任何类型值的快速排序类或方法。
但是,当排序方法可以采用任何类型的值时,它不一定会告诉您如何实际排序。
以下是 I 如何从您的问题中声明内容:
public class Quicksort
{
public void Sort<T>(IList<T> collection)
where T : IComparable<T>
{
...
}
}
如果不发布quicksort方法的实际实现,那么好处将是:
T
T
知道如何将自己与其他T
(where T : IComparable<T>
)进行比较,这意味着如果您要对int进行排序,那么任何一个int可以告诉你它是在之前或之后,还是与任何其他int相同。IList<T>
表示您可以采用T
的任何可预索引类型的集合。 Quicksort通常依赖于能够知道集合中要排序的元素数量,而IList<T>
是.NET集合世界中可以这样做的最小类型(除非你使用IList
非-generic interface)。问题只有你知道答案:
numbers
为QuickSort
的实例变量?为什么你需要实例变量?答案 1 :(得分:0)
使用泛型:
public class QuickSort<T> where T : IComparable<T>
您必须使用IComparable<T>
界面而不是比较运算符进行排序。
或者只是:
public class QuickSort<T>
但是你必须在算法中使用IComparer<T>
。您可以使用T
Comparer<T>.Default
类型的默认值
无论哪种方式,标准比较运算符(<
,>
等)都不适用于泛型类型。
答案 2 :(得分:0)
您可以使用泛型:
public class QuickSort<T>
{
T[] numbers;
public QuickSort(T[] input) {
numbers = input;
Console.WriteLine("QuickSort created!");
}