首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#计数List<string>中的连续重复

C#计数List<string>中的连续重复
EN

Stack Overflow用户
提问于 2014-08-21 14:13:28
回答 2查看 1.8K关注 0票数 0

我有一个字符串列表,并希望对其中的重复项进行计数,以便稍后处理此信息。简单地计算副本是非常容易的,但不幸的是,我只想计算连续的重复。

假设我们有一个包含以下字符串项的列表:

"1A“、"3B”、"5X“、"7Q”、"2W“、"2G”、"2J“、"1A”、"2A“

现在我想数一下这个列表中的副本。我只看每个字符串的第一个字符,可以忽略字符串中的其他字符!我们得到的是2x "1%“和3x "2%",我实际上想要得到的是连续的重复,所以我的结果应该是3x "2%”。2x "1A“必须被忽略,它们不是连续的。(% =地点持有人)

我编写了一个循环遍历列表的代码,并将一个字符串与下一个字符串进行比较。

代码语言:javascript
运行
复制
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%“必须被视为重复。如果要循环遍历列表,则如果第一个元素和最后一个元素不相等,则只需在列表的末尾进行拆分。

伪码:

代码语言:javascript
运行
复制
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份副本。我必须检查十亿个列表,所以性能是非常重要的

由于他们在德国学校没有教更好的英语,我希望任何人都能理解我的问题所在,并且愿意帮助我解决问题。

这不是任何家庭作业的一部分。

EN

Stack Overflow用户

回答已采纳

发布于 2014-08-21 15:57:44

我建议您将以列表中相同的字符开头的项目分组。这个分组的结果将是一个List<List<string>>。这使得与小组一起工作变得更容易了。

代码语言:javascript
运行
复制
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("--------");
foreach (string s in result) {
    Console.Write(s);
    Console.Write("  ");
}
Console.WriteLine();
Console.ReadKey();
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25428636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档