zoukankan      html  css  js  c++  java
  • ArrayList排序

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Collections;
     6 
     7 namespace ArrySort
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             ArrayList arry = new ArrayList() { new Person() { Name = "apple", Age = 12 }, new Person() { Name = "dog", Age = 64 }, new Person() { Name = "cat", Age = 41 } };
    14             Console.WriteLine("排序之前");
    15             for (int i = 0; i < arry.Count; i++)
    16             {
    17                 Console.WriteLine(((Person)arry[i]).Name);
    18             }
    19             arry.Sort();
    20             Console.WriteLine("排序之后");
    21             for (int i = 0; i < arry.Count; i++)
    22             {
    23                 Console.WriteLine(((Person)arry[i]).Name);
    24             }
    25             Console.ReadKey();
    26         }
    27 
    28         public class Person : IComparable//实现IComparable接口,则可以调用排序方法Sort(),否则对于有多个参数的对象,Sort()方法不知道该具体比较哪一项
    29         {
    30             public string Name { get; set; }
    31             public int Age { get; set; }
    32 
    33             
    34             public int CompareTo(object obj)//返回值>0表示比比较对象大,=0跟比较对象相等,<0比比较对象小
    35             {
    36                 Person p = obj as Person;//因为传入的是object类型,所以要将传入的参数转换为需要比较的类型
    37                 if (p == null)
    38                 {
    39                     throw new ArgumentException();//参数无效异常
    40                 }
    41                 else
    42                 {
    43                     //return this.Age - p.Age;//可以自定义按照类型的某一属性进行比较
    44                     return this.Name.Length - p.Name.Length;
    45                 }
    46             }
    47         }
    48     }
    49 }

    实现IComparable接口,则ArrayList可以调用排序方法Sort(),否则对于有多个参数的对象,Sort()方法不知道该具体比较哪一项

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Collections;
     6 
     7 namespace UseOfICompare
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             ArrayList array = new ArrayList() {new Person(){Name = "Alice",Age = 42},new Person(){Name = "dog",Age = 62},new Person(){Name = "cat",Age = 15}};
    14             Console.WriteLine("比较前");
    15             for (int i = 0; i < array.Count; i++)
    16             {
    17                 Console.WriteLine(((Person)array[i]).Name);
    18             }
    19 
    20             //array.Sort(new CompareByNameLength());
    21             array.Sort(new CompareByAge());
    22 
    23             Console.WriteLine("比较之后");
    24             for (int i = 0; i < array.Count; i++)
    25             {
    26                 Console.WriteLine(((Person)array[i]).Name);
    27             }
    28             Console.ReadKey();
    29         }
    30     }
    31 
    32     public class Person
    33     {
    34         public string Name { get; set; }
    35         public int Age { get; set; }
    36     }
    37 
    38     public class CompareByNameLength : IComparer//实现IComparer接口,其实是做了一个比较器,比较器专门用来比较某一项,将比较器作为参数传入ArrayList的排序Sort()方法就可以实现比较了
    39     {
    40         public int Compare(object x, object y)//同样返回值是>0,<0,=0
    41         {
    42             Person p1 = x as Person;
    43             Person p2 = y as Person;
    44             if (p1 == null && p2 == null)
    45             {
    46                 throw new ArgumentException();//参数类型错误异常
    47             }
    48             else
    49             {
    50                 return p1.Name.Length - p2.Name.Length;//按姓名长度比较
    51             }
    52         }
    53     }
    54 
    55     public class CompareByAge : IComparer
    56     {
    57         public int Compare(object x, object y)
    58         {
    59             Person p1 = x as Person;
    60             Person p2 = y as Person;
    61             if (p1 == null && p2 == null)
    62             {
    63                 throw new ArgumentException();//参数类型错误
    64             }
    65             else
    66             {
    67                 return p1.Age - p2.Age;
    68             }
    69         }
    70     }
    71 
    72 }

    就一个Person对象来说,如果有两个属性,分别为Name和Age,如果某个时段想用Name长度来作为比较,某个时段想用Age大小来作为比较,如果让Person实现ICompareable接口就不太合适了,因为实现ICompareable接口再调用ArrayList的Sort()方法对按照在比较Person类中定义的规则进行一项的比较。

    public int Compare(object x, object y)方法中传入两个对象是内部实现,只需要调用array.sort(new XXXXX());就可以了。

  • 相关阅读:
    深入理解HTTP协议及原理分析
    如何提高php应用的性能?
    PHP的网站主要攻击方式有哪些?
    五种常见的 PHP 设计模式
    排序算法之插入排序类
    排序算法之交换排序类
    Redis之Zset
    Redis之Set
    Redis之List
    Redis之Hash
  • 原文地址:https://www.cnblogs.com/T-J-D/p/3931799.html
Copyright © 2011-2022 走看看