Maha

Maha

  • NA
  • 0
  • 326.3k

AlphanumComparatorFast

Oct 23 2013 4:50 PM
In this program why it is necessary to check whether s1 and s2 are not null, because it is obviously known s1 and s2 are not null. This program is given in the following website. Problem is highlighted.

http://www.dotnetperls.com/alphanumeric-sorting

using System;
using System.Collections;

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;

// Walk through two the strings with two markers.

while (marker1 < len1 && marker2 < len2)
{
char ch1 = s1[marker1];
char ch2 = s2[marker2];

// Some buffers we can build up characters in for each chunk.

char[] space1 = new char[len1];
int loc1 = 0;
char[] space2 = new char[len2];
int loc2 = 0;

// Walk through all following characters that are digits or
// characters in BOTH strings starting at the appropriate marker.
// Collect char arrays.

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]));

// If we have collected numbers, compare them numerically.
// Otherwise, if we have strings, compare them alphabetically.

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;
}
}

class Program
{
static void Main()
{
string[] highways = new string[]
{
"100F",
"50F",
"SR100",
"SR9"
};
//
// We want to sort a string[] array called highways in an
// alphanumeric way. Call the static Array.Sort method.
//
Array.Sort(highways, new AlphanumComparatorFast());
//
// Display the results
//
foreach (string h in highways)
Console.WriteLine(h);

Console.ReadKey();
}
}
/*
50F
100F
SR9
SR100
*/


Answers (2)