Monday, July 2, 2012

Sorting Alphanumeric


Sorting Alphanumeric:
IComparer interface
public class AlphanumComparatorFast : IComparer
{
    public int Compare(object x, object y)
    {
 string s1 = x as string;
 if (s1 == null)
 {
     return 0;
 }
 string s2 = y as string;
 if (s2 == null)
 {
     return 0;
 }

 int len1 = s1.Length;
 int len2 = s2.Length;
 int marker1 = 0;
 int marker2 = 0;
 while (marker1 < len1 && marker2 < len2)
 {
     char ch1 = s1[marker1];
     char ch2 = s2[marker2];
     char[] space1 = new char[len1];
     int loc1 = 0;
     char[] space2 = new char[len2];
     int loc2 = 0;
     do
     {
  space1[loc1++] = ch1;
  marker1++;

  if (marker1 < len1)
  {
      ch1 = s1[marker1];
  }
  else
  {
      break;
  }
     } while (char.IsDigit(ch1) == char.IsDigit(space1[0]));

     do
     {
  space2[loc2++] = ch2;
  marker2++;

  if (marker2 < len2)
  {
      ch2 = s2[marker2];
  }
  else
  {
      break;
  }
     } while (char.IsDigit(ch2) == char.IsDigit(space2[0]));

     string str1 = new string(space1);
     string str2 = new string(space2);

     int result;

     if (char.IsDigit(space1[0]) && char.IsDigit(space2[0]))
     {
  int thisNumericChunk = int.Parse(str1);
  int thatNumericChunk = int.Parse(str2);
  result = thisNumericChunk.CompareTo(thatNumericChunk);
     }
     else
     {
  result = str1.CompareTo(str2);
     }

     if (result != 0)
     {
  return result;
     }
 }
 return len1 - len2;
    }
}

//Main method
using System;
using System.Collections;

class Program
{
    static void Main()
    {
 string[] highways = new string[]
 {
     "100F",
     "50F",
     "SR100",
     "SR9"
 };
 
 Array.Sort(highways, new AlphanumComparatorFast());
 
 foreach (string h in highways)
 {
     Console.WriteLine(h);
 }
    }
}
Output:
50F
100F
SR9
SR100

No comments:

Post a Comment