none
icomparer.compare 的小问题 RRS feed

  • 问题

  •     using System;
    using System.Data;
    using System.Configuration;
     using System.Web;
    using System.Web.Security;
     using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Collections;


    public partial class _Default : System.Web.UI.Page
    { protected void Page_Load(object sender, EventArgs e)
    { ArrayList arr1 = new ArrayList(); //循环添加元素1~5
     for (int i = 1; i < 6; i++) //arr1:{1,2,3,4,5}
     arr1.Add(i); //使用逆比较策略,实现逆排序
     IComparer myComparer = new myReverserClass();
    arr1.Sort(myComparer); //
     //输出
     int j = 0;
    foreach (int item in arr1)
    { Page.Response.Write("[ " + j + " ]: " + item + "<br />");
     j++; } }

     public class myReverserClass : IComparer
    { /// <summary> 
    /// 实现比较接口,采取逆比较策略
    /// </summary> 
    /// <param name="x"></param> 
    /// <param name="y"></param> 
    /// <returns></returns>
     int IComparer.Compare(Object x, Object y)///a.想知道x,y的具体含义 
    { if (Convert.ToInt32(x) > Convert.ToInt32(y)) return -1;
    else if (Convert.ToInt32(x) == Convert.ToInt32(y))
    return 0;
     else  return 1;
     } } }


    1.a处的,object x,y 的具体指代是啥?
    2.if else if 的里面的代码的具体含义是啥? return -1,0,1分别是啥意思。

    3,能否看到arr1里面的变化的数值?如果可以,怎样看呢?要一步一步教偶,偶不懂得。
    2009年5月13日 13:19

答案

  • public class myReverserClass : IComparer
    { 
        /// <summary>  
        /// 实现比较接口,采取逆比较策略 
        /// </summary>  
        int IComparer.Compare(Object x, Object y)
        {
            // Q1: 想知道x,y的具体含义
            // x: 要比较的第一个对象
            // y: 要比较的第一个对象
    
            // Q2: if else if 的里面的代码的具体含义是啥? 。
            // 比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。
    
            // Q3: return -1, 0, 1分别是啥意思
            // -1: x 小于 y
            //  0: x 等于 y
            //  1: x 大于 y
    
            // IComparer.Compare 主要是为了实现自定义排序, 你可以实现它的倒序,正序的排列,也可以按照 int, string 来进行排序, 也可以排列对象等等
            if (Convert.ToInt32(x) > Convert.ToInt32(y))
                return -1;
            else if (Convert.ToInt32(x) == Convert.ToInt32(y))
                return 0;
            else return 1;
        }
    }

    知识改变命运,奋斗成就人生!
    2009年5月13日 15:31
    版主
  • 你好!
         请问你说的“能否看到arr1里面的变化的数值?”是什么意思啊?没有理解!
         如果你想看arr1里面的每个元素,可以这样:
         foreach(object o in arr1)
         {
                int i=(int)o;
          }
          是这个意思吗?
       
    周雪峰
    2009年5月14日 2:31
    版主

全部回复

  • public class myReverserClass : IComparer
    { 
        /// <summary>  
        /// 实现比较接口,采取逆比较策略 
        /// </summary>  
        int IComparer.Compare(Object x, Object y)
        {
            // Q1: 想知道x,y的具体含义
            // x: 要比较的第一个对象
            // y: 要比较的第一个对象
    
            // Q2: if else if 的里面的代码的具体含义是啥? 。
            // 比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。
    
            // Q3: return -1, 0, 1分别是啥意思
            // -1: x 小于 y
            //  0: x 等于 y
            //  1: x 大于 y
    
            // IComparer.Compare 主要是为了实现自定义排序, 你可以实现它的倒序,正序的排列,也可以按照 int, string 来进行排序, 也可以排列对象等等
            if (Convert.ToInt32(x) > Convert.ToInt32(y))
                return -1;
            else if (Convert.ToInt32(x) == Convert.ToInt32(y))
                return 0;
            else return 1;
        }
    }

    知识改变命运,奋斗成就人生!
    2009年5月13日 15:31
    版主
  • 你好!
         请问你说的“能否看到arr1里面的变化的数值?”是什么意思啊?没有理解!
         如果你想看arr1里面的每个元素,可以这样:
         foreach(object o in arr1)
         {
                int i=(int)o;
          }
          是这个意思吗?
       
    周雪峰
    2009年5月14日 2:31
    版主
  • 谢谢,因为能看到的是排序前的数组arr1,以及排完序的数组arr1, 偶想看看排序进行到一半的时候,数组里面数据的变化,好像没法看呢,能帮忙么?
    2.
    // Q3: return -1, 0, 1分别是啥意思
            // -1: x 小于 y
            //  0: x 等于 y
            //  1: x 大于 y

            // IComparer.Compare 主要是为了实现自定义排序, 你可以实现它的倒序,正序的排列,也可以按照 int, string 来进行排序, 也可以排列对象等等
            if (Convert.ToInt32(x) > Convert.ToInt32(y))
                return -1;
    这里不是说,x>y,才返回-1的么? // -1: x 小于 y,所以不懂
    3.
    返回-1是不是把元素的下标提前一个啊?谢谢


    maiyude
    2009年5月15日 8:22
  • 在 IComparer.Compare 方法里面打断点然后调试看看

    知识改变命运,奋斗成就人生!
    2009年5月15日 8:24
    版主
  • 偶试过的,只能看到x,y,看不到arr1里面的变化的,

    还有偶上面说的三个问题呢。
    maiyude
    2009年5月15日 8:26
  • 真有爱~
    2009年5月15日 8:45
  • 你在Compare方法里打断点看不到吗?
    你在监视窗口中输入arr1[0],arr1[1]等试试!
    周雪峰
    2009年5月15日 9:34
    版主
  • 谢谢版主,
    打断点看不到变化的过程的。
    偶试过了,程序一进入myReverserClass,arr1[0],arr1[1]等立马就变成灰色了,没法看见。。。呜呜。。。
    maiyude
    2009年5月16日 2:08
  • 哦!可能是因为arr1是另一个类的局部变量吧,你把arr1定义为成员试试!
    请问为什么要看这个变化的过程呢?
    周雪峰
    2009年5月16日 4:22
    版主
  • 谢谢啦,偶不会定义成员的。偶只是好奇想看看这个变化的过程。。。。。谢谢各位大大。


    maiyude
    2009年5月20日 10:37
  • 实际上Sort内部用的是快速排序算法,你了解一下这个算法就知道过程了啊!

    周雪峰
    2009年5月20日 11:03
    版主
  • 谢谢啊,偶搞不懂算法的,谢谢版主大大。
    maiyude
    2009年5月20日 11:04
  • 不客气啊!欢迎常来啊!
    周雪峰
    2009年5月20日 11:06
    版主
  • 不客气啊!欢迎常来啊!
    周雪峰

    谢谢老周帮我招呼客人。。。
    有效回复过700 撒花
    2009年5月22日 2:44
    版主