使用链表进行字符计数



我正在尝试设计一个程序,该程序一次读取一个字节的ASCII文本文件,并输出每个字符出现次数的频率计数。

输出不需要排序。字符频率对象需要使用Linked List进行处理和存储。

我知道我的字符频率类还可以,但是我不知道如何计算字符。这是我到目前为止的代码,但我的计数最终为0.

LinkedList<CharacterFrequency> list = new LinkedList<CharacterFrequency>();
CharacterFrequency cf = new CharacterFrequency();
StreamReader file = new StreamReader(@"input.txt");
var ch = -1;
while ((ch = file.Read ()) !=-1)
{
LinkedListNode<CharacterFrequency> node;
node = list.Find(cf);
if (list.Any())
{
cf.Increment();
}
if (node != null)
{
list.AddLast(cf);
}
}
Console.WriteLine(cf.ToString());
file.Close();
//and here is my character frequency class;
class CharacterFrequency
{
private Char m_char;
private int m_count;
public CharacterFrequency()
{
m_char = '';
m_count = 0;
}
public CharacterFrequency(Char ch)
{
m_char = ch;
m_count = 0;
}
public CharacterFrequency(Char ch, int count)
{
m_char = ch;
m_count = count;
}
public CharacterFrequency(CharacterFrequency cf)
{
m_char = cf.Character;
m_count = cf.Count;
}
public Char Character
{
get
{
return m_char;
}
set
{
m_char = value;
}
}
public int Count
{
get
{
return m_count;
}
set
{
if (m_count > value)
m_count = value;
}
}
public void Increment()
{
m_count++;
}
public override string ToString()
{
return String.Format("{0}({1}) {2}", m_char, (int)m_char, m_count);
}
public override int GetHashCode()
{
return (int)m_char;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj.GetType() == GetType()))
return false;
CharacterFrequency rhs = (CharacterFrequency)obj;
return this.Character == rhs.Character;
}
}

更新的代码(我还没有能够解决增量方法的问题(:

class Program
{
static void Main(string[] args)
{
int ch;
const int Input_File = 0;
const int Output_File = 1;
StreamReader reader = null;
StreamWriter writer = null;
//linked list declaration
LinkedList<CharacterFrequency> list =
new LinkedList<CharacterFrequency>();

//read the characters from the input file
reader = new StreamReader(File.OpenRead(args[Input_File]));

while ((ch = reader.Read ()) !=-1)//casts to integer
{
CharacterFrequency cf = LinkedList<CharacterFrequency>list(ch); //attempt to create linked list from character frequency BIG ISSUES HERE!
LinkedListNode<CharacterFrequency> node; //attempt to create node
node = list.Find(cf); // find method
if (node != null) //increment if found
{
node.Value.Increment();
}
else //add if not found
{
list.AddLast(cf);
}
}
reader.Close();

//write outputfile
writer = new StreamWriter(File.OpenWrite(args[Output_File]));
foreach (CharacterFrequency cf in list)
writer.WriteLine(cf.ToString());
writer.Close();
}
}

}

我怀疑问题出在这里:

if (list.Any())
{
cf.Increment();
}

我认为应该是(您可能需要对其进行更多调整(:

if(node != null) {
node.getData().increment();
}
else {
list.AddLast(cf);
}

还有一个问题 你不使用ch.在循环开始时,您应该从已读取的字符重新创建LinkedListNode<CharacterFrequency> cf,否则代码将不起作用。

编辑:你不能多次声明一个变量,所以只需把它放在循环之外

CharacterFrequency cf;
while ((ch = reader.Read ()) !=-1)//casts to integer
{
cf = LinkedList<CharacterFrequency>list(ch); 
....

最新更新