利用"委托"实现对象实例按"多字段嵌套"排序

原创 2004年10月29日 01:04:00

/*<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

利用"委托"实现对象实例按"多字段嵌套"排序

 

(不知道大家看懂题目了? 功能还是挺实用的!)

本文实现 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)",如果还一样再按"体重(Weight)"!

        //注意这只是排序的结果而以,如果要按此思路编下去,就有"递归"的意思了,然而层次却无法确定!

        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(Object Prev, Object Next)

    {

        // 这里一定要用 "小于等于(<=)","等于"就是为了实现:

        // 如果两元素前一规则(如: 年龄)排序相等,就按下一规则(如: 身高)排序

        // 如果 "前一元素 <= 后一元素" ,返回"真",返回"假"!

        return (((Person) Prev)._age <= ((Person) Next)._age);

    }

    public static bool PrevIsHigherThanNext(Object Prev, Object Next)

    {

        return(((Person) Prev)._height <= ((Person) Next)._height);

    }

    public static bool PrevIsHeavierThanNext(Object Prev, Object Next)

    {

        return(((Person) Prev)._weight <= ((Person) Next)._weight);

    }

}

 

// "排序功能(工具)类"

class Sorter

{

    // 声明委托

    public delegate bool CompareOp(object X, object Y);

   

    //本排序的基本算法就是冒泡法最常见简单易懂,属于"交换"排序法的一种!

    public static void BubbleSort(object[] 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) //冒泡法交换元素的条件

                    {

                        // 冒泡法交换元素

                        object o = A[i];

                        A[i] = A[j];

                        A[j] = o;

                    }

                }

            }

        }

    }

}

 

// 好了就讲到这里了!,有兴趣的读者可以改用别的排序算法,期待在评论回复中"貂尾续狗"!

 

elasticsearch5.2搜索结果排序

elasticsearch搜索会根据对搜索词的命中率计算一个scrot的值,可以根据这个值进行排序。但是有的时候我们需要将标题之类重要字段的命中的记录排到前面,这里就可以灵活的给某一个字段加权,使这种...
  • cardinalzbk
  • cardinalzbk
  • 2017年02月23日 11:34
  • 1043

java List多字段排序方法

java中对List接口的实例按实体的字段排序。如下例:package se;import java.util.ArrayList; import java.util.Collections; imp...
  • joson793847469
  • joson793847469
  • 2016年09月28日 11:50
  • 1366

C++使用vector按多字段排序。

C++当中vector的数据类型是基本类型时,我们利用std::sort很容易排序,当我们的类型是自定义的结构体,并且我们还要实现按多字段排序,我有两种方法: 1.我们通过重载operator方法来...
  • kyfvc
  • kyfvc
  • 2013年09月30日 09:41
  • 3667

java list按照元素对象的指定多个字段属性进行排序

java list按照元素对象的多个字段属性进行排序
  • Enable1234___
  • Enable1234___
  • 2016年11月18日 23:39
  • 7489

LINQ 按多个字段排序(orderby、thenby、Take)

LINQ 按多个字段排序(orderby、thenby、Take;orderby  子句解析为 OrderBy()方法,orderby descending 子句解析为OrderBy Descendi...
  • fuyifang
  • fuyifang
  • 2015年04月10日 17:16
  • 6019

elasticsearch-基于多字段,字符串内部排序

字符串排序与多字段 被解析的字符串字段也是多值字段, 但是很少会按照你想要的方式进行排序。如果你想分析一个字符串,如 fine old art , 这包含 3 项。我们很可能想要按第一项的字...
  • chuan442616909
  • chuan442616909
  • 2017年02月15日 11:24
  • 268

thinkphp 多字段排序

order("id desc,title desc,onclick desc")
  • lengyue1084
  • lengyue1084
  • 2013年07月03日 15:16
  • 1104

JavaScript前端对象数组排序核心方法(支持多列排序)

// 缓存当前数据 var tempDataArray = [{name:"linc",age:28},{name:"linda",age:26}]; // 存储排序后的数据 var currentD...
  • hllinc8
  • hllinc8
  • 2016年09月28日 19:03
  • 1041

通过委托实现灵活排序

我们在实际的编程中我们,常用的一些排序方法并不能满足我们的需求。比如,有时候我们需要给兔子的身高去排队,有时候我们需要去给青蛙的身高去排队,但是对于蛇,我们只能去比较蛇的身长。,对每一种动物去比较的时...
  • yy763496668
  • yy763496668
  • 2016年06月11日 11:53
  • 222

java 按list对象多个字段排序

Java List中的数据如何根据对象的某一个或多个字段排序引出Comparable和comparator的使用       第一节  对于引入题目的探讨 首先把引入题目表述的清楚一些,在一...
  • yinxianluo
  • yinxianluo
  • 2015年02月12日 13:47
  • 11888
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用"委托"实现对象实例按"多字段嵌套"排序
举报原因:
原因补充:

(最多只允许输入30个字)