组合哈希表并写入文件
本文关键字:文件 哈希表 组合 | 更新日期: 2023-09-27 18:01:31
我已经创建了2个哈希表。在这两个哈希表中,它们都有相同的键,但值不同。我使用排序列表对两个哈希表进行了排序,以使两个表上的键按顺序排列。我要做的是将两个哈希表写入文本文件,并在此文本文件中,它将具有密钥(在两个哈希表中都是相同的),其值来自哈希表1和哈希表2旁边的值。数据由制表符分隔,看起来像下面这样:
Key Value Value
128 123 6
143 255 4
Hashtable frequency = new Hashtable();
Hashtable grouplist = new Hashtable();
SortedList Grp = new SortedList (grouplist);
SortedList Freg = new SortedList(frequency);
foreach (DictionaryEntry entry in Grp)
{
foreach (DictionaryEntry maxval in Freq)
{
file.Write(entry.Key);
file.Write("'t");
file.Write(entry.Value);
file.Write("'t");
if(Freq[entry.Key].Equals(Grp[maxval.Key]))
{
file.WriteLine(maxval.Value);
}
}
}
我已经尝试了许多方法让它只写一个哈希表中的键和值以及第二个哈希表中的值,但它只是重复写每个键75次(这是两个哈希表的键总数)。
我有许多以上代码的变体,它们都做同样的事情(如果需要,可以发布它们)。如有任何帮助,不胜感激。
另外,我唯一能让它工作并写下需要的东西(每次75次)的方法是,如果我放一个- !-在if语句中,即使两个key是相同的。在调试程序时,我甚至检查了它们是否相同。——谢谢
问题是你循环了75 x 75次。这就像你的代码写得像…
for (each of the 75 elements in one sorted lists)
for (each of the 75 elements in the other sorted list)
你要做的只是循环你的一个集合,使用它的键索引到另一个集合,像这样…
foreach (DictionaryEntry entry in Grp)
var Key = entry.Key;
file.Write(Key);
file.Write("'t");
file.Write(frequency[Key].Value);
file.Write("'t");
file.Write(groupList[Key].Value);
file.Write("'t");
理想情况下,您应该将两个哈希表封装为单个哈希表(这样您就不必担心不一致,维护哈希表的代码也更容易)。除非:
SortedList frequencies = new SortedList(frequency);
foreach(var entry in frequencies) {
file.WriteLine(
String.Format(
"{0}'t{1}'t{2}",
entry.Key,
frequency[entry.Key],
grouplist[entry.Key]
)
);
}
你试过这样做吗?
foreach (DictionaryEntry entry in Grp)
{
file.Write(entry.Key);
file.Write("'t");
file.Write(entry.Value);
if (Freq.ContainsKey(entry.Key))
{
file.Write("'t");
file.Write(Freq[entry.Key]);
}
file.WriteLine();
}
基本上,对于Grp
中的每个项,将其写入文件。如果Freq
中存在匹配的键,则将Freq
中的值写入文件。我还将您的WriteLine
调用排除在外,以便它总是发生(在您的示例中它没有发生)。
我还没有测试过这个,但也许它会给你一些东西。
我不知道,为什么你使用两个foreach循环。我修改了你的代码如下:
Hashtable frequency = new Hashtable();
Hashtable grouplist = new Hashtable();
SortedList Grp = new SortedList(grouplist);
foreach(DictionaryEntry entry in Grp) {
file.Write(entry.Key);
file.Write("'t");
file.Write(entry.Value);
file.Write("'t");
object maxVal = grouplist[entry.Key];
if(maxVal != null)
file.WriteLine(maxVal);
file.WriteLine();
}