c#System.Array类的静态方法Sort()可以对一维数组进行从小到大的排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#System.Array类的静态方法Sort()可以对一维数组进行从小到大的排序相关的知识,希望对你有一定的参考价值。
但不是任何数组都是可以使用该方法排序的,只有数组成员实现了IComparable接口才可以使用该Sort方法,请编写一个代表学生的类Student,该类有2个字段stuName和stuScore,该类实现了IComparable的CompareTo方法接成绩排序。
其实就是让你写一个类,实现IComparable接口,再通过调用Sort方法对该类的实例(一维数组)排序。
class Student:IComparableprivate string name;
private int score;
public int CompareTo(object obj)
Student _obj = obj as Student;
if (_obj != null)
return this.score.CompareTo(_obj.score);
else
throw new ArgumentException("Object is not a Student !");
追问
怎么用SORT实例?
追答每个学生的信息对应一个student类的实例。然后把这些实例放到数组中:
namespace testclass Program
class Student:IComparable
private string name;
private int score;
//添加一个构造函数
public Student(string _name,int _score)
name = _name;
score = _score;
public int CompareTo(object obj)
Student _obj = obj as Student;
if (_obj != null)
return this.score.CompareTo(_obj.score);
else
throw new ArgumentException("Object is not a Student !");
static void Main(string[] args)
//实例化一个对象
Student[] myArray = new Student[] new Student("Mike", 80), new Student("Nice", 90), new Student("Lily", 77) ;
//用静态类的sort方法排序
Array.Sort<Student>(myArray);
参考技术A 你上网上查询IComparable 网上就有答案 参考技术B 请问你这是在干什么?追问
我也没看懂 老师布置的作业
C++排序方法
【中文标题】C++排序方法【英文标题】:C++ sort method 【发布时间】:2010-04-26 22:15:14 【问题描述】:我想使用 std::sort 对向量进行排序,但我的排序方法是一个类的静态方法,我想在它之外调用 std::sort,但这样做似乎很麻烦。
在课堂上:
static int CompareIt(void *sol1, void *sol2) ...
std::sort 调用:
sort(distanceList.at(q).begin(),
distanceList.at(q).end(),
&DistanceNodeComparator::CompareIt);
不应该这样吗?
【问题讨论】:
您似乎混淆了 std::sort 和 qsort。 【参考方案1】:std::sort
接受一个比较器,该比较器接受集合中保存的类型的值并返回bool
。它通常应该实现一些<
的概念。例如,假设您的 distanceList 元素具有整数集合(我假设它们没有,但为了示例):
static bool CompareIt(int sol1, int sol2) ...
当然,如果还没有一个 <
运算符可以为您的场景做正确的事情,您只需要提供一个比较器。
【讨论】:
【参考方案2】:应该是布尔方法(sort默认使用运算符
【讨论】:
【参考方案3】:您提供的比较函数具有qsort
所需的签名,这是C++ 出现之前C 提供的排序函数。 sort
需要完全不同的函数。
例如,如果您的 distanceList
声明是 std::vector<DistanceNode>
,您的函数将如下所示:
static bool CompareIt(const DistanceNode &sol1, const DistanceNode &sol2)
return sol1.key < sol2.key;
请注意,使用标准sort
算法对std::list
进行排序效率不高,这就是list
提供自己的sort
成员函数的原因。
【讨论】:
【参考方案4】:正如其他人提到的,it needs a boolean return type。这是一个有效的示例:
#include "stdafx.h"
#include <vector>
#include <algorithm>
using namespace std;
class MyClass
public:
static bool CompareIt(const void *a1, const void *a2)
return a1 < a2;
;
int _tmain(int argc, _TCHAR* argv[])
// Create a vector that contains elements of type MyData
vector<void*> myvector;
// Add data to the vector
myvector.push_back((void*)0x00000005);
myvector.push_back((void*)0x00000001);
// Sort the vector
std::sort(myvector.begin(), myvector.end(), MyClass::CompareIt);
// Display some results
for( int i = 0; i < myvector.size(); i++ )
printf("%d = 0x%08X\n", i, myvector[i] );
return 0;
[编辑] 更新了上面的代码,使其更简单一些。我并不是说它是很好的代码,但是如果不了解更多关于 OP 的实际实现,很难给出更好的例子!
【讨论】:
在您的示例中,如果仅调用 我不得不说这是(ab)使用 STL 的糟糕方式。虽然可能拥有void *
的向量,但实际上这样做并不是一个好主意。
我只是想要一个示例,该示例显然可以作为 OP 在他/她的问题中提出的原则证明。当然,当 OP 没有发布他们实际解决的问题的完整细节时,这是一个无用/危险的例子。【参考方案5】:
首先,返回类型应该是bool
。实际上,要求只是返回类型可以分配给bool
,int
是。但是您返回 int
的事实表明您可能编写了一个三路比较器,而不是 std::sort 要求的严格的弱排序。
您的 CompareIt 函数将两个 void*
指针作为参数。 distanceList.at(q)
是 vector<void*>
(或可转换为 void*
的向量)?如果不是,那么比较器输入也不正确。将void*
与算法一起使用也表明您做错了什么,因为泛型编程的大部分意义在于您不需要稍后会被强制转换回其原始类型的不透明指针。
【讨论】:
以上是关于c#System.Array类的静态方法Sort()可以对一维数组进行从小到大的排序的主要内容,如果未能解决你的问题,请参考以下文章