tabs ↹ over ␣ ␣ ␣ spaces

by Jiří {x2} Činčura

“Zmenšení” pole

28 Oct 2007 1 mins .NET

Před pár týdny jsem do jednoho projektu potřeboval “zmenšit” pole. Šlo o to, že čísla v poli se posílala poměrně omezeným kanálem (mail+url) a vzhledem k tomu, že to byla IDčka záznamů z DB, která byla plus mínus “za sebou” a rostla s časem chtělo to mít alespoň trochu konstatní velikost výsledku (až budou IDčka v řádu tisíců zbytečně plýtváme). Udělal jsem proto triviální “pack” a “unpack”.

// the array SHOULD be sorted
static int[] Pack(int[] input)
{
	//we need at least 2 items in array
	if (!(input.Length > 1))
		throw new ArgumentException();
	int[] result = new int[input.Length];
	result[0] = input[0];
	for (int i = 1; i < input.Length; i++)
	{
		result[i] = input[i] - input[i - 1];
	}
	return result;
}
static int[] Unpack(int[] input)
	{
	//we need at least 2 items in array
	if (!(input.Length > 1))
		throw new ArgumentException();
	int[] result = new int[input.Length];
	result[0] = input[0];
	for (int i = 1; i < input.Length; i++)
	{
		result[i] = result[i - 1] + input[i];
	}
	return result;
}

Pokud jsou ID přibližně za sebou (což jsem já měl) a nejsou tam velké skoky, můžeme tímto poměrně dost znaků ušetřit.

Pozn.: Nakonec se tento postup stejně nepoužil, takže to byla práce do šuplíku na blog. V případě použití doporučuji pořádně otestovat. 😃

Ukázka:

Input:
1000
1001
1002
1003
1010
Pack:
1000
1
1
1
7
Unpack:
1000
1001
1002
1003
1010

Profile Picture Jiří Činčura is .NET, C# and Firebird expert. He focuses on data and business layers, language constructs, parallelism, databases and performance. For almost two decades he contributes to open-source, i.e. FirebirdClient. He works as a senior software engineer for Microsoft. Frequent speaker and blogger at www.tabsoverspaces.com.