标签归档:arraylist

c#简单的学生成绩排序

c#上机作业

源代码:

 

//TestStudent.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestStudent
{
    public class Student : IComparable
    {
        private string name;
        private float score;
        public Student()
        {
        }
        public Student(string name, float score)
        {
            this.name = name;
            this.score = score;
        }
        public string Name
        {
            set
            {
                this.name = value;
            }
            get
            {
                return this.name;
            }
        }

        public float Score
        {
            set
            {
                this.score = value;
            }
            get
            {
                return this.score;
            }
        }
        public int CompareTo(object obj)
        {
            return (int)(this.score - ((Student)obj).score);
        }
 
    }
}

//main.cs
using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace TestStudent
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList arr = new ArrayList();
            string line = Console.ReadLine();
            while (line != "Exit" && line != "Sort" )
            {
                string[] infos = line.Split(new char[] { ' ' });
                Student s = new Student(infos[0], float.Parse(infos[1]));
                arr.Add(s);
                line = Console.ReadLine();
            }
            if (line == "Sort")
            {
                arr.Sort();
                for (int i = 0; i < arr.Count; i++)
                {
                    Console.WriteLine(((Student)arr[i]).Name + " : " + ((Student)arr[i]).Score.ToString());
                }
            }
            Console.ReadKey();
        }
    }
}

 

c#按字符串中的数字排序问题

在.net 的framewrok框架中提供的排序方法中,如string.sort() 或ArrayList.Sort()方法。这两个方法对字符串排序时,如果字符串中含有数字,则不会按数字大小排序。如:

如下有四个字符串,
 ArrayList list = new ArrayList(4);
 List.Add(“aa1”);
List.Add(“aa100);
 List.Add(“aa10);
 List.Add(“aa2”);
 List.Sort();
我们原意希望排序后的顺序为:
 aa1,aa2,aa10,aa100
可是上面的代码执行后的排序顺序为
 aa1,aa10,aa100,aa2
为了序排序后的效果为我们想要的按字符串中的数值排序,我们必须重写字符串的比较函数。
代码思路:
由于比较两个字符串时,是逐个比较字符,先从第一个字符开始比较,取出两个字符串中的第一个字符比较,如果比较结果是大于,则说明第一个字符串大于第二个字符串,如果小于,则说明第一个字符串小于第二字符串,如果等于,则比较两个字符串中的第二个字符。如果比到最后也是相等,则说明两个字符串一样大,如果有一个字符串要多一些字符,则这个字符串在大一些。
我们改进这个算法:在比较过程中如果发现数字,则先不进行比较,看下一个字符是否为数字,这个取出两个字符串中的数字,按数字的数值大小来进行比较。如果相等再取一个字符进行比较。
如下我的代码:(注:对于上面的例子,由于我们可以利用sort()函数的另一重载方法。Sort (
        IComparer comparer
))
故我们只需要写一个继承自Icomparer接口的比较类,即可。
///
    ///主要用于文件名的比较。
    ///
    public class FilesNameComparerClass : IComparer 
    {
 
       // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
       ///
       ///比较两个字符串,如果含用数字,则数字按数字的大小来比较。
       ///
       ///
       ///
       ///
       int IComparer.Compare( Object x, Object y ) 
       {
           if(x==null||y==null)
              throw new ArgumentException("Parameters can't be null");  
 
           string fileA = x as string;
           string fileB = y as string;
           char[] arr1   =   fileA.ToCharArray();  
           char[] arr2 = fileB.ToCharArray();
               
           int i = 0, j =0;                         
           while( i < arr1.Length && j < arr2.Length)                        
           {
              if ( char.IsDigit( arr1[i]) && char.IsDigit( arr2[j] ) )
              {  
                  string s1 = "",s2 = "";                                              
                  while ( i < arr1.Length && char.IsDigit( arr1[i]) )
                  {
                     s1 += arr1[i];
                     i++;
                  }
                  while (j < arr2.Length && char.IsDigit( arr2[j] ))
                  {
                     s2 += arr2[j];
                     j++;
                  }
 
                  if ( int.Parse( s1 ) > int.Parse( s2) )
                  {
                     return 1;
                  }
 
                  if ( int.Parse( s1 ) < int.Parse( s2) )
                  {
                     return -1;
                  }
                    
              }
              else
              {
                  if ( arr1[i] > arr2[j] )
                  {
                     return 1;
                  }
 
                  if ( arr1[i] < arr2[j] )
                  {
                     return -1;
                  }
                  i++;
                  j++;
 
              }                
 
           }
 
           if ( arr1.Length == arr2.Length )
           {
              return 0;
           }
           else
           {
              return arr1.Length > arr2.Length? 1: -1;
           }
             
           //            return string.Compare( fileA, fileB );
           //            return( (new CaseInsensitiveComparer()).Compare( y, x ) );
       }
    }
 
 
 
 
调用时的代码如下:
IComparer fileNameComparer = new FilesNameComparerClass();          
              List.Sort( fileNameComparer );
 
这样排序后的字符串就为按字符串中的数值排序了,为:
aa1,aa2,aa10,aa100