![]() |
忐忑的薯片 · 十二背后旅游风景区_百度百科· 8 月前 · |
![]() |
考研的西红柿 · “头寸”是什么意思?· 11 月前 · |
![]() |
风流倜傥的金针菇 · 如何评价《原神》2.7 ...· 1 年前 · |
![]() |
老实的刺猬 · 性价比很高长安汽车UNI-K ...· 1 年前 · |
![]() |
勤奋的洋葱 · 破赛会纪录!丹东小伙儿夺得国际田径比赛200 ...· 1 年前 · |
我有一个字符串列表,并希望对其中的重复项进行计数,以便稍后处理此信息。简单地计算副本是非常容易的,但不幸的是,我只想计算连续的重复。
假设我们有一个包含以下字符串项的列表:
"1A“、"3B”、"5X“、"7Q”、"2W“、"2G”、"2J“、"1A”、"2A“
现在我想数一下这个列表中的副本。 我只看每个字符串的第一个字符,可以忽略字符串中的其他字符! 我们得到的是2x "1%“和3x "2%",我实际上想要得到的是连续的重复,所以我的结果应该是3x "2%”。2x "1A“必须被忽略,它们不是连续的。(% =地点持有人)
我编写了一个循环遍历列表的代码,并将一个字符串与下一个字符串进行比较。
int counter = 0;
for (int i = 0; i < list.Count; i++)
char first = list[i][0];
if ((i + 1) == list.Count) break;
char second = list[(i + 1)][0];
if (first == second)
counter++;
}
我想您可以想象这段代码是一种非常糟糕的方法,特别是如果您想使用输出。而且,我的代码无法处理我需要的特性。
我正在寻找的代码必须能够处理我想要实现的两个特性。首先,如果我的列表的最后一个元素等于列表的第一个元素,那么一行重复项不会结束。
例如:
"1A“、"1B”、"5X“、"7Q”、"2J“、"1I”
因为"1I“和"1A”是“一排排”,所以"1%“必须被视为重复。如果要循环遍历列表,则如果第一个元素和最后一个元素不相等,则只需在列表的末尾进行拆分。
伪码:
if(list.First()[0] != list.Last()[0])
我想要实现的第二个特性是,列表中没有重复的项目,加上超过4的“重复计数”,将被删除。如果没有一个重复行的“重复计数”或长度超过4,我想返回。
例如:
"1A“、"1B”、"5X“、"3Q”、"1J“、"1I”
重复计数== 4所以返回
"1A“、"1B”、"1X“、"3Q”、"1J“、"1I”
复制
count == 5
,保存这五个项目,删除列表中的任何其他项目。
"1A“、"1B”、"1X“、"3Q”、"1I“、"1Z”、"1Z“
重复计数== 6,保存这六项,删除列表中的任何其他项。
注意:每个字符串的第一个字符很重要。输入列表将有7个项目,而不是一个项目或多或少。没有结果列表,必须更新旧的结果列表。如果重复计数低于或等于4,则没有工作可做,只需返回即可。一排中不会有超过5份副本。我必须检查十亿个列表,所以性能是非常重要的
由于他们在德国学校没有教更好的英语,我希望任何人都能理解我的问题所在,并且愿意帮助我解决问题。
这不是任何家庭作业的一部分。
发布于 2014-08-21 15:57:44
我建议您将以列表中相同的字符开头的项目分组。这个分组的结果将是一个
List<List<string>>
。这使得与小组一起工作变得更容易了。
var list = new List<string> {
"1A", "3B", "5X", "7Q", "2W", "2G", "2J", "1B", "1C", "1D", "1E"
var groups = new List<List<string>>();
char lastChar = (char)0; // We assume that NUL will never be used as first char.
List<string> group = null;
foreach (string s in list) {
if (s[0] != lastChar) {
group = new List<string>();
groups.Add(group);
lastChar = s[0];
group.Add(s);
// Join the first and the last group if their first char is equal
int lastIndex = groups.Count - 1;
if (groups.Count > 2 && groups[0][0][0] == groups[lastIndex][0][0]) {
// Insert the elements of the last group to the first group
groups[0].InsertRange(0, groups[lastIndex]);
// and delete the last group
groups.RemoveAt(lastIndex);
//TODO: Remove test
foreach (List<string> g in groups) {
Console.WriteLine(g[0][0]);
foreach (string s in g) {
Console.WriteLine(" " + s);
// Now create a list with items of groups having more than 4 duplicates
var result = new List<string>();
foreach (List<string> g in groups) {
if (g.Count > 4) {
result.AddRange(g);
//TODO: Remove test
Console.WriteLine("--------");