0

我有一个包含近 100000 个条目的文本文件。他们都处于某种模式,比如
word1 word2 word3 word4

但是,其中许多条目是重复的,其中所有单词都相同。当我尝试读取并形成唯一数组或列表时,我正在使用中间哈希集来执行此操作。它工作得很好。
但基本上我想要实现的只是 word2 的唯一条目。就像 word2 很常见而所有其他都不同一样,我想保留任何一个条目。
例如
cat dog lion tiger
cat dog deer bear
mouse rat bear deer
lion tiger cat dog
cat dog deer bear

在这种情况下,所需的输出将是:
cat dog lion tiger
mouse rat bear deer
lion tiger cat dog

或者
cat dog deer bear
mouse rat bear deer
lion tiger cat dog

目前哈希集给出的是:

cat dog lion tiger
cat dog deer bear
mouse rat bear deer
lion tiger cat dog

鉴于数据集很大,有关如何有效实现这一点的任何建议。在这里使用正则表达式是唯一的选择吗?我正在使用 C#。

4

2 回答 2

1

检查数据并将第二个单词放入字典中以了解它是否之前出现过。代码示例:

    string[] file = {   "cat dog lion tiger",
                    "cat dog deer bear",
                    "mouse rat bear deer",
                    "lion tiger cat dog",
                    "cat dog deer bear"};

    Dictionary<string, string> dict = new Dictionary<string, string>();

    List<string> lst = new List<string>();

    foreach (string s in file)
    {
        string[] words = s.Split(' ');
        // assumption - thare are at least 2 words in a line - validate it
        if (!dict.ContainsKey(words[1]))
        {
            lst.Add(s);
            dict.Add(words[1], words[1]);
        }
    }

    foreach (string s1 in lst)
        Console.WriteLine(s1);
于 2013-07-21T06:02:18.787 回答
0

您可以创建一个辅助类来存储字符串并实现 IEqualityComparer 到 HashSet 的接口,

例子:

        HashSet<WordsRow> list = new HashSet<WordsRow>(new WordsRow());

        list.Add(new WordsRow("cat dog lion tiger"));
        list.Add(new WordsRow("cat dog deer bear"));
        list.Add(new WordsRow("mouse rat bear deer"));
        list.Add(new WordsRow("lion tiger cat dog"));
        list.Add(new WordsRow("cat dog deer bear"));


        foreach (WordsRow row in list)
        {
            Console.WriteLine(row.Row);
        }

“WordRow 类”必须包含以下内容:

public class WordsRow : IEqualityComparer<WordsRow>
{
    public string Row {get; set;}

    public WordsRow() { }

    public WordsRow(string row)
    {
        this.Row = row;                        
    }

    public bool Equals(WordsRow x, WordsRow y)
    {
        return x.Row.Split(' ')[1] == y.Row.Split(' ')[1];
    }

    public int GetHashCode(WordsRow obj)
    {
        return obj.Row.Split(' ')[1].GetHashCode();
    }
}
于 2013-07-21T07:48:44.133 回答