如何在C#中按字母顺序打印字符串中出现的字符?
有谁能帮我找到一种最有效的方法,以字母顺序将字符和该字符一起打印在给定字符串中 我能计算字符串中字符的出现次数,但不能按字母顺序排序如何在C#中按字母顺序打印字符串中出现的字符?,c#,string,sorting,C#,String,Sorting,有谁能帮我找到一种最有效的方法,以字母顺序将字符和该字符一起打印在给定字符串中 我能计算字符串中字符的出现次数,但不能按字母顺序排序 string OutputString = string.Empty; int count = 1; char[] charArr = inputString.ToCharArray(); for (int i = 0; i < charArr.Length; i++) { for (int j = i + 1; j < charArr.Len
string OutputString = string.Empty;
int count = 1;
char[] charArr = inputString.ToCharArray();
for (int i = 0; i < charArr.Length; i++) {
for (int j = i + 1; j < charArr.Length; j++) {
if (charArr[i] == charArr[j])
count++;
}
if (!OutputString.Contains(charArr[i]))
OutputString += charArr[i].ToString() + count.ToString();
count = 1;
}
OutputString = string.Concat(OutputString.OrderBy(c => c));
您可以使用Linq来简化此过程:
string s = "xgdgyd";
var result = s
.GroupBy(c => c)
.Select(g => g.Key.ToString() + g.Count())
.OrderBy(x => x);
Console.WriteLine(string.Concat(result)); // Outputs "d2g2x1y1"
这里最有用的是GroupBy()
,它将所有相同的项目组合在一起。这允许我们使用g.Count()
来计算每组中的项目数
然后我们将每个组键(一个字符)及其计数连接到一个字符串中
(我已经将代码简化为使用string.Concat()而不是string.Join()。您可以使用Linq来简化:
string s = "xgdgyd";
var result = s
.GroupBy(c => c)
.Select(g => g.Key.ToString() + g.Count())
.OrderBy(x => x);
Console.WriteLine(string.Concat(result)); // Outputs "d2g2x1y1"
这里最有用的是GroupBy()
,它将所有相同的项目组合在一起。这允许我们使用g.Count()
来计算每组中的项目数
然后我们将每个组键(一个字符)及其计数连接到一个字符串中
(我已经将代码简化为使用string.Concat()而不是string.Join()。由@Matthew with LINQ给出的解决方案是完美的,但是如果您想要一个带有for循环的解决方案,如您所述,请执行此操作 首先对inputString进行排序,然后删除最后对OutputString进行排序的代码行,如下所示:
string inputString = "xgdgyd";
inputString = string.Concat(inputString.OrderBy(c => c));
string OutputString = string.Empty;
int count = 1;
char[] charArr = inputString.ToCharArray();
for (int i = 0; i < charArr.Length; i++)
{
for (int j = i + 1; j < charArr.Length; j++)
{
if (charArr[i] == charArr[j])
count++;
}
if (!OutputString.Contains(charArr[i]))
OutputString += charArr[i].ToString() + count.ToString();
count = 1;
}
string inputString=“xgdgyd”;
inputString=string.Concat(inputString.OrderBy(c=>c));
string OutputString=string.Empty;
整数计数=1;
char[]charArr=inputString.ToCharArray();
for(int i=0;i
由@Matthew with LINQ给出的解决方案是完美的,但是如果您想要一个带有for循环的解决方案,正如您所发布的那样,那么就这样做
首先对inputString进行排序,然后删除最后对OutputString进行排序的代码行,如下所示:
string inputString = "xgdgyd";
inputString = string.Concat(inputString.OrderBy(c => c));
string OutputString = string.Empty;
int count = 1;
char[] charArr = inputString.ToCharArray();
for (int i = 0; i < charArr.Length; i++)
{
for (int j = i + 1; j < charArr.Length; j++)
{
if (charArr[i] == charArr[j])
count++;
}
if (!OutputString.Contains(charArr[i]))
OutputString += charArr[i].ToString() + count.ToString();
count = 1;
}
string inputString=“xgdgyd”;
inputString=string.Concat(inputString.OrderBy(c=>c));
string OutputString=string.Empty;
整数计数=1;
char[]charArr=inputString.ToCharArray();
for(int i=0;i
由于您可能还不了解LINQ,下面是一个使用“经典”技术的解决方案:
string input = "xgdgyd";
char[] charArr = input.ToCharArray();
Array.Sort(charArr); // Sort before counting as Gian Paolo suggests!
// ==> "ddggxy"
int count;
string output = "";
for (int i = 0; i < charArr.Length; i += count) { // Increment by count to get
// the next different char!
count = 1;
// Note that we can combine the conditions within the for-statement
for (int j = i + 1; j < charArr.Length && charArr[j] == charArr[i]; j++) {
count++;
}
output += charArr[i] + count.ToString();
}
Console.WriteLine(output); // ==> d2g2x1y1
更高级的技术是使用
StringBuilder
。请参见Jon Skeet。因为您可能还不了解LINQ,这里有一个使用“经典”技术的解决方案:
string input = "xgdgyd";
char[] charArr = input.ToCharArray();
Array.Sort(charArr); // Sort before counting as Gian Paolo suggests!
// ==> "ddggxy"
int count;
string output = "";
for (int i = 0; i < charArr.Length; i += count) { // Increment by count to get
// the next different char!
count = 1;
// Note that we can combine the conditions within the for-statement
for (int j = i + 1; j < charArr.Length && charArr[j] == charArr[i]; j++) {
count++;
}
output += charArr[i] + count.ToString();
}
Console.WriteLine(output); // ==> d2g2x1y1
更高级的技术是使用
StringBuilder
。请参见Jon Skeet。在开始构建结果之前,您应该计算所有字符的数量。我将开始对字符串进行排序,然后计算每个不同字符的出现次数。获取所需的字符串应该很容易。是否要区分大小写?听起来像是家庭作业?在开始构建结果之前,您应该计算所有字符。我将开始对字符串排序,然后计算每个不同字符的出现次数。获取您需要的字符串应该很容易。您想区分大小写吗?听起来像是家庭作业吗?我认为,正式来说,您应该在GroupBy之后执行OrderBy,因此在Select之后执行OrderBy。这应该适用于这些字符串值。@HenkHolterman是的,这将减少要排序的项的数量。这也是,但我不认为GroupBy承诺保留输入的顺序。总是喜欢看到长代码浓缩成优雅的Linq:)@HenkHolterman实际上,GroupBy()
确实保留了顺序-:分组中的元素是按照它们在源代码中出现的顺序生成的。
我认为,从形式上讲,您应该在GroupBy之后执行OrderBy,因此在Select之后。这应该适用于这些字符串值。@HenkHolterman是的,这将减少要排序的项的数量。这也是,但我不认为GroupBy承诺保留输入的顺序。总是喜欢看到长代码浓缩成优雅的Linq:)@HenkHolterman实际上,GroupBy()
保留顺序-:分组中的元素是按照它们在源代码中出现的顺序生成的。