我有一个包含近100000个条目的文本文件。所有这些都处于某种模式,如
word1 word2 word3 word4
然而,在所有单词相同的情况下,这些条目中的一些是重复的。当我尝试读取并形成一个唯一的数组或列表时,我使用中间哈希集来执行此操作。而且效果很好。
但基本上我想要实现的只是word2的唯一条目。如果word2是常见的而且所有其他的都不同,我想保留任何一个条目
e.g
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#。
答案 0 :(得分: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);
答案 1 :(得分: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();
}
}