サーバー メッセージを Twitter でクライアントに公開したいと考えています。
残念ながら、Twitter では 140 文字以下の投稿しか許可されていません。これは残念です。
ここで、サーバーからのさまざまなメッセージを連結して最大 140 文字に短縮するアルゴリズムを作成する必要があります。
それはかなりトリッキーです。
コード
static string concatinateStringsWithLength(string[] strings, int length, string separator) {
// This is the maximum number of chars for the strings
// We have to subtract the separators
int maxLengthOfAllStrings = length - ((strings.Length - 1) * separator.Length);
// Here we save all shortenedStrings
string[] cutStrings = new string[strings.Length];
// This is the average length of all the strings
int averageStringLenght = maxLengthOfAllStrings / strings.Length;
// Now we check how many strings are longer than the average string
int longerStrings = 0;
foreach (string singleString in strings)
{
if (singleString.Length > averageStringLenght)
{
longerStrings++;
}
}
// If a string is smaller than the average string, we can more characters to the longer strings
int maxStringLength = averageStringLenght;
foreach (string singleString in strings)
{
if (averageStringLenght > singleString.Length)
{
maxStringLength += (int)((averageStringLenght - singleString.Length) * (1.0 / longerStrings));
}
}
// Finally we shorten the strings and save them to the array
int i = 0;
foreach (string singleString in strings)
{
string shortenedString = singleString;
if (singleString.Length > maxStringLength)
{
shortenedString = singleString.Remove(maxStringLength);
}
cutStrings[i] = shortenedString;
i++;
}
return String.Join(separator, cutStrings);
}
これに関する問題
このアルゴリズムは機能しますが、あまり最適化されていません。実際よりも少ない文字を使用します。
これに関する主な問題は、変数が、および後方にlongerStrings
相対的であることです。maxStringLength
これは、私が変更しlongerStrings
た場合、変更された場合などを意味maxStringLength
します。while ループを作成して、変更がなくなるまでこれを行う必要がありますが、このような単純なケースでは必要ないと思います。
続行する方法の手がかりを教えてもらえますか?
それとも、似たようなものがすでに存在するのでしょうか?
ありがとう!
編集
サーバーから受け取るメッセージは次のようになります。
- メッセージ
- 主題
- 日にち
- 体
- メッセージ
- 主題
- 日にち
- 体
等々。
私が望むのは、文字列を区切り記号 (この場合はセミコロン) で連結することです。
最大長があるはずです。長い弦は最初に短くする必要があります。
例
これは主題
です これは体で、少し長いです...
25.02.2013
これは...
これは...
25.02.2013
私はあなたがアイデアを得ると思います;)