zoukankan
html css js c++ java
利用"委托"实现类的对象实例按"多字段嵌套"排序
/**/
/*
利用"委托"实现对象实例按"多字段嵌套"排序
(不知道大家看懂题目了? 功能还是有点儿用的!)
本文实现 Person 类的实例们按 年龄、身高、体重等字段嵌套排序!
就像 SQL 查询的 Order By 字段1,字段2,,字段n 子句的效果一样!
*/
using
System;
class
Class1
//
客户程序
{
static
void
Main()
{
Person[] Persons
=
{
//
姓名、年龄、身高、体重
new
Person(
"
张栢芝
"
,
71
,
178
,
49
)
,
new
Person(
"
章子怡
"
,
23
,
177
,
33
)
,
new
Person(
"
周 迅
"
,
71
,
180
,
80
)
,
new
Person(
"
徐静蕾
"
,
12
,
150
,
70
)
,
new
Person(
"
赵 薇
"
,
23
,
166
,
60
)
,
new
Person(
"
宋丹丹
"
,
50
,
183
,
50
)
,
new
Person(
"
翠花儿
"
,
23
,
177
,
34
)
,
new
Person(
"
赵丽蓉
"
,
50
,
184
,
40
)
,
new
Person(
"
郭晶晶
"
,
50
,
184
,
41
)
}
;
//
"BubbleSorter.CompareOp 委托" 类型数组的元素顺序,规定了嵌套排序的顺序,即:
//
先按"年龄(Age)"排序,如果一样再按"身高(Height)",如果还一样再按"身高(Height)"!
//
注意这只是排序的结果而以,如果要按此思路编下去,就有"递归"的意思了,然而层次却无法确定!
Sorter.CompareOp[] PersonCompareOp
=
{
//
你可以调换元素顺序,来改变排序的字段顺序
new
Sorter.CompareOp(Person.PrevIsOlderThanNext)
,
new
Sorter.CompareOp(Person.PrevIsHigherThanNext)
,
new
Sorter.CompareOp(Person.PrevIsHeavierThanNext)
}
;
//
转到 Person 类 和 BubbleSorter 类的实现!
Sorter.BubbleSort(Persons, PersonCompareOp);
for
(
int
i
=
0
; i
<
Persons.Length; i
++
)
Console.WriteLine(Persons[i].ToString());
Console.ReadLine();
}
}
class
Person
{
private
string
_name;
private
int
_age;
private
int
_weight;
private
int
_height;
public
Person(
string
Name,
int
Age,
int
Height,
int
Weight)
{
this
._name
=
Name;
this
._age
=
Age;
this
._height
=
Height;
this
._weight
=
Weight;
}
public
override
string
ToString()
{
return
string
.Format(_name
+
"
, {0:N}, {1:N}, {2:N}
"
, _age, _height, _weight);
}
//
下面"额外"定义了若干与委托签名一致匹配的静态方法,供"委托调用"
//
返回值为"真"时,代表 "前一元素 <= 后一元素" ,否则为"假"!
//
只要参照这里,我们可以为类添加的排序功能并定义排序规则!
//
多么简单啊! 剩下的工作就都留给 "排序功能(工具)类" 去做吧!
public
static
bool
PrevIsOlderThanNext(Person Prev, Person Next)
{
//
这里一定要用 "小于等于(<=)","等于"就是为了实现:
//
如果两元素前一规则(如: 年龄)排序相等,就按下一规则(如: 身高)排序
//
如果 "前一元素 <= 后一元素" ,返回"真",返回"假"!
return
(Prev._age
<=
Next._age);
}
public
static
bool
PrevIsHigherThanNext(Person Prev, Person Next)
{
return
(Prev._height
<=
Next._height);
}
public
static
bool
PrevIsHeavierThanNext(Person Prev, Person Next)
{
return
(Prev._weight
<=
Next._weight);
}
}
//
"排序功能(工具)类"
class
Sorter
{
//
声明委托
public
delegate
bool
CompareOp(Person X, Person Y);
//
本排序的基本算法就是冒泡法最常见简单易懂,属于"交换"排序法的一种!
public
static
void
BubbleSort(Person[] A, CompareOp[] MoreThanMethod)
//
MoreThanMethod 就是排序的字段顺序
{
for
(
int
k
=
0
; k
<
MoreThanMethod.Length; k
++
)
//
遍历委托数组
{
for
(
int
i
=
0
; i
<
A.Length; i
++
)
//
冒泡法外层循环
{
for
(
int
j
=
i
+
1
; j
<
A.Length; j
++
)
//
冒泡法内层循环
{
bool
b
=
true
;
for
(
int
m
=
0
; m
<=
k; m
++
)
{
//
如果两元素前一规则(如: 年龄)排序相等,就按下一规则(如: 身高)排序
b
=
b
&&
MoreThanMethod[m](A[j], A[i]);
}
if
(b)
//
冒泡法交换元素的条件
{
//
冒泡法交换元素
Person p
=
A[i];
A[i]
=
A[j];
A[j]
=
p;
}
}
}
}
}
}
查看全文
相关阅读:
ColoFolXS for Mac 2.0.1高级取色工具。
Airmail for Mac 5.1 强大的、最小的电子邮件客户端。
Downcast for Mac 2.11.1 下载、播放和同步您的播客。
iCollections for Mac 7.1.3 整理您的桌面图标。
Aurora HDR 2019 for Mac 1.0.1 高级 HDR 软件。
oracle树结构查询
windows注册表:开机启动的程序
chm提取html
oracle忘记sys密码处理
点击文字实现radio 选中(不使用js)
原文地址:https://www.cnblogs.com/Microshaoft/p/130511.html
最新文章
Android读取文本文件中内容的方法
inux权限管理(1)
Linux下chkconfig命令详解
Linux网络属性配置命令和管理详解
find命令的基本用法
localStorage 简单示例
浅谈浏览器插件检测 和自定义协议的支持
记录一则垃圾IE6的问题
从 12306 订购火车票 无需FQ
jQuery 判断鼠标键
热门文章
iframe 自适应高度
将下载到的FLAC APE 等文件 转换为iPod 使用的 AAC格式
IE6 打不开页面 错误原因
在线生成代码
解决谷歌没法用的问题
RAW Power for Mac 3.4 释放 Apple 原始照片引擎的强大功能。
ACDSee Photo Studio for Mac 7.7.1 全面的摄影控制。
Grids for Instagram for Mac 7.0.16 一种体验 Instagram 的美妙方式。
Librarian Pro for Mac 7.0.5 完善的个人库存系统。
Storyist for Mac 4.2.4 小说家的故事开发工具。
Copyright © 2011-2022 走看看