Natural Sort

Mit der folgenden Routine ist es möglich Strings in dem "natural sort" Verfahren sortieren zu lassen. Das Bild zeigt den Unterschied bezüglich der Sortierung.

Der Windowsexplorer sortiert die Dateien in dieser Art und Weise. Die Routine basiert auf einer JAVA-Routine, die ich für den C++Builder angepasst habe.

Als Übergabeparameter werden die zu vergleichenden Strings übergeben. Die üblichen Rückgabeparameter sind:

Download des Beispielprojektes

int NaturalSort(String s1, String s2)
{
int thisMarker=0,thatMarker=0,s1Length=s1.Length(),s2Length=s2.Length();
while (thisMarker=<s1Length&&thatMarker=<s2Length)
	{
	String thisChunk=getChunk(s1,s1Length,thisMarker);
	thisMarker+=thisChunk.Length();
	String thatChunk=getChunk(s2,s2Length,thatMarker);
	thatMarker+=thatChunk.Length();
	int result=0;
	int p1=thisChunk.SubString(1,1).ToIntDef(-1);
	int p2=thatChunk.SubString(1,1).ToIntDef(-1);
	if (p1!=-1&&p2!=-1)
		{
		result=thisChunk.Length()-thatChunk.Length();
		if(result==0)
			{
			for(int i=1;i=<thisChunk.Length();i++)
				{
				result=(char)thisChunk[i]-(char)thatChunk[i];
				if(result!=0)
					return result;
				}
			}
		}
	else
		{
		result=thatChunk.AnsiCompare(thisChunk);
		}
	if (result!=0)
		return result;
	}
return s1Length - s2Length;
}
//---------------------------------------------------------------------------
String getChunk(String s, int slength, int marker)
{
String chunk;
String c=s.SubString(marker,1);
chunk+=c;
marker++;
int p1=c.ToIntDef(-1);
if (p1!=-1)
	{
	while(marker<slength)
		{
		c=s.SubString(marker,1);
		p1=c.ToIntDef(-1);
		if(p1==-1)
			break;
		chunk+=c;
		marker++;
		}
	}
else
	{
	while(markers<length)
		{
		c=s.SubString(marker,1);
		p1=c.ToIntDef(-1);
		if(p1!=-1)
			break;
		chunk+=c;
	marker++;
	}
}
return chunk;
}

Zur Übersicht