泛型--实现IComparable接口

9.6.1 实现IComparable接口

像所有集合类一样,List实现了Sort()方法,它允许您对所有实现了IComparable接口的对象进行排序。在下一个例子中,您将修改Employee类以实现IComparable:

public class Employee : IComparable<Employee>

实现IComparable<Employee>接口,Employee对象必须提供CompareTo()方法:

public int CompareTo(Employee rhs)
{
  return this.empID.CompareTo(rhs.empID);
}

CompareTo()方法把Employee做为参数。我们知道使用Employee是因为这是一个类型安全的集合。当前Employee对象必须把它自己跟做为参数传递进来的Employee进行对比,如果返回-1,表示它小于参数,如果大于参数则返回1,如果两者相等则返回0。这意味着决定大于、小于、等于的是Employee。在本例中,您委托成员empId进行比较。empId成员是一个int类型,并使用了整数类型默认的CompareTo()方法,以对比两个值之间的大小。

System.Int32类实现了Icomparable<Int32>接口,所以您可以把比较的职责委托给整数类型。

您现在准备对员工数组列表(empList)进行排序,为了查看排序是否正常工作,您需要随机地添加整数和Employee实例到它们各自的数组中。创建随机数,需要实例化Random类;调用Random对象的Next()方法产生随机数。Next()方法是一个重载方法;一种版本允许您传递一个整数值,表示您想要的最大随机数。在本例中,您将传递10来产生一个0到10之间的随机数:(译者注:参数为10,最大的随机数只能为9)

Random r = new Random();

r.Next(10);

例9-14创建了一个整型数组和一个Employee数组,并给两者填充随机数,并打印它们的值。随后排序数组并打印新值。

例9-14 排序整数和employee数组

using System;
using System.Collections.Generic;
using System.Text;
namespace IComparable
{
  // 一个简单的用于存储在数组中的类
  public class Employee : IComparable<Employee>
  {
   private int empID;
   public Employee( int empID )
   {
     this.empID = empID;
   }
   public override string ToString( )
   {
     return empID.ToString( );
   }
   public bool Equals( Employee other )
   {
     if ( this.empID == other.empID )
     {
      return true;
     }
     else
     {
      return false;
     }
   }
   // Employee使用整数默认的CompareTo方法
   public int CompareTo( Employee rhs )
   {
     return this.empID.CompareTo( rhs.empID );
   }
  }
  public class Tester
  {
   static void Main( )
   {
     List<Employee> empArray = new List<Employee>( );
     List<Int32> intArray = new List<Int32>( );
     // 产生整数和employee的ID的随机数
     Random r = new Random( );
     // 填充数组
     for ( int i = 0; i < 5; i++ )
     {
      // 添加随机的employee的id
      empArray.Add( new Employee( r.Next( 10 ) + 100 ) );
      // 添加随机的整数
      intArray.Add( r.Next( 10 ) );
     }
     // 显示整型数组中的所有内容
     for ( int i = 0; i < intArray.Count; i++ )
     {
      Console.Write( "{0} ", intArray[i].ToString( ) );
     }
     Console.WriteLine( "\n" );
     // 显示Employee数组中的所有内容
     for ( int i = 0; i < empArray.Count; i++ )
     {
      Console.Write( "{0} ", empArray[i].ToString( ) );
     }
     Console.WriteLine( "\n" );
     // 整型数组排序
     intArray.Sort( );
     for ( int i = 0; i < intArray.Count; i++ )
     {
      Console.Write( "{0} ", intArray[i].ToString( ) );
     }
     Console.WriteLine( "\n" );
     // employee数组排序并显示
     //原文的下面这两句应该注释掉,现在还没用到
     //Employee.EmployeeComparer c = Employee.GetComparer( );
     //empArray.Sort(c);
     empArray.Sort( );
     // 显示Employee数组中的所有内容
     for ( int i = 0; i < empArray.Count; i++ )
     {
      Console.Write( "{0} ", empArray[i].ToString( ) );
     }
     Console.WriteLine( "\n" );
   }
  }
}

时间: 2024-07-30 00:12:55

泛型--实现IComparable接口的相关文章

java-JAVA泛型,Comparable接口的泛型

问题描述 JAVA泛型,Comparable接口的泛型 背景:我现有两个类 一个类是Employee implements Comparable<Employee> 另一个是Manager extends Employee 现在要写函数,在任意数组中找到最大和最小的存入Pair对象中public static <T extends Comparable<T>> Pair<T> minmax(T[] a) { if(a == null || a.length

泛型,IEnumerable接口 ,处理遍历的问题。

问题描述 有这么一个题目,关于树形遍历的问题,我不太理解泛型,IEnumerable<T>,IEnumerable接口在其中的作用,以及能做什么不知道可否讲解一下,这个题的思路,以及大致的解题思路.谢谢了.题目如下:usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;namespaceConsoleApplication2{//说明://以下为一个树的节点的定义,假定:除了需要填写的代码外,其他属性和方法均已实

泛型-java 缓存接口设计疑问。

问题描述 java 缓存接口设计疑问. 我想问,下面两种设计的区别 . 第一种 public interface ICache<T> { T getItem(Serializable key) ; void setItem(Serializable key, T item) ; } 第二种 public interface ILocalCache<K, V> { public V get(K key) ; void setItem(K key, V item) ; } 第一种跟第二

Java泛型--泛型实例--标识接口的定义

一个人的信息: ·基本信息 ·联系方式 此时,肯定要设计一个接口,因为只有实现了此接口的类才应该可以表示出人的信息. interface Info{ // 只有此接口的子类才是表示人的信息 } interface Info{ // 只有此接口的子类才是表示人的信息 } class Contact implements Info{ // 表示联系方式 private String address ; // 联系地址 private String telphone ; // 联系方式 private

[CLR via C#]13. 接口

原文:[CLR via C#]13. 接口 一.类和接口继承 在Microsoft.Net Framwork中,有一个名为System.Object的类,它定义了4个公共实例方法:ToString, Equals, GetHashCode和GetType.该类是其他所有类的根或者说最终基类.换言之,所有类都继承了Object的4个实例方法.这还意味着能操作Object类的实例的代码实际能操作任何类的实例. 在CLR中,任何类都肯定从一个类也只能从一个类(而且只能从Objetc派生的类)派生的.这

泛型--约束

9.5 约束 有的时候,您必须确保添加进泛型列表中的元素拥有某些约束(例如,它们从一个给定的基类继承或它们实现了指定的接口).在下面的例子中,我们实现了一个简单的可排序的单链表.链表由多个Node组成,每个Node必须保证添加进去的元素实现了IComparer接口.您可以这样声明: public class Node<T> : IComparable<Node<T>> where T : IComparable<T> 这句代码定义了一个泛型Node,它操作类

[c#基础]泛型集合的自定义类型排序

引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不停的重复.一直相信,在你不知道要干嘛的时候,浮躁的时候,不如回到最基础的东西上,或许换种思考方式,会有不一样的收获. 泛型集合List<T>排序 先看一个简单的例子,int类型的集合: 1 using System; 2 using System.Collections.Generic; 3 us

[CLR via C#]12. 泛型

原文:[CLR via C#]12. 泛型 泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算法,比如排序.搜索.交换等.但是定义算法的开发人员并不设定该算法要操作什么数据类型:该算法可广泛地应用于不同类型的对象.然后,另一个开发人员只要指定了算法要操作的具体数据类型,就可以使用这个现成的算法了. 泛型有两种表现形式:泛型类型和泛型方法. 泛型类型:大多数算法都封装在一个类型中,CLR允许创建泛型引用

java-Java怎么实现泛型数据的比较

问题描述 Java怎么实现泛型数据的比较 public class ArrayImplementation <Element> implements Iterable<Element>{ private Element [] list; public ArrayImplementation (final int initSize) { list = (Element[]) new Object[initSize]; this.size = initSize; } private b