using System; using System.Windows.Forms; using System.IO; using System.Collections; using System.Text.RegularExpressions; namespace LiteLib { /// /// Summary description for SortTree. /// public class SortTree { public SortTreeNode Root; public int Count; public bool Modified; public SortTree() { } public void Clear() { Root = null; Count = 0; Modified = false; } private SortTreeNode Add(string strText, int nCount, object Tag) { SortTreeNode node = Add(ref strText); node.Count = nCount; node.Tag = Tag; return node; } public SortTreeNode Add(ref string str) { SortTreeNode node; if(Root == null) { Root = new SortTreeNode(); node = Root; } else { node = Root; while(true) { if(node.Text == str) { node.Count++; return node; } if(node.Text.CompareTo(str) > 0) { // add the node at the small branch if(node.Small == null) { node.Small = new SortTreeNode(); node.Small.Parent = node; node = node.Small; break; } node = node.Small; } else { // add the node at the great branch if(node.Great == null) { node.Great = new SortTreeNode(); node.Great.Parent = node; node = node.Great; break; } node = node.Great; } } } node.Text = str; node.ID = this.Count++; node.Count++; Modified = true; return node; } public void Save(string fileName, System.Text.Encoding code) { FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None); StreamWriter writer = new StreamWriter(stream, code); BitArray bitArray = new BitArray(this.Count, false); SortTreeNode node = this.Root; int nCount = this.Count; while(nCount > 0) { if(node.Small != null && bitArray.Get(node.Small.ID) == false) node = node.Small; else if(bitArray.Get(node.ID) == false) OutNode(node, writer, bitArray, ref nCount); else if(node.Great != null && bitArray.Get(node.Great.ID) == false) node = node.Great; else { if(bitArray.Get(node.ID) == false) OutNode(node, writer, bitArray, ref nCount); node = node.Parent; } } writer.Close(); stream.Close(); Modified = false; } public void Open(string fileName, System.Text.Encoding code, ListView list) { FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = new StreamReader(stream, code); SortTreeNode node = null; int nTagCount = 0; ArrayList array = new ArrayList(); string str; while((str = reader.ReadLine()) != null) { string[] strCols = str.Split('\t'); for(int n = 0; n < strCols.Length; n++) { string strCol = strCols[n]; if(n == 0) { if(strCol != "") { node = new SortTreeNode(); node.Text = strCol; array.Add(node); nTagCount = 0; } } else if(n == 1) { try { if(strCol != "") node.Count = int.Parse(strCol); } catch(Exception e) { MessageBox.Show(e.Message); } } else { if(nTagCount++ > 0) node.Tag += "\r\n"; node.Tag += strCol; } } } reader.Close(); stream.Close(); Random rand = new Random(); while(array.Count > 0) { int nIndex = rand.Next(array.Count); node = (SortTreeNode)array[nIndex]; array.RemoveAt(nIndex); node = this.Add(node.Text, node.Count, node.Tag); if(list != null) { ListViewItem item = list.Items.Add((node.ID+1).ToString()); item.SubItems.Add(node.Text); item.SubItems.Add(node.Count.ToString()); item.Tag = node; } } } bool OutNode(SortTreeNode node, StreamWriter writer, BitArray bits, ref int nCount) { if(node == null || bits.Get(node.ID) == true) return false; string str = node.Text + '\t' + node.Count.ToString() + '\t'; if(node.Tag != null) str += node.Tag.ToString().Replace("\r\n", "\r\n\t\t"); writer.WriteLine(str.TrimEnd('\t')); bits.Set(node.ID, true); nCount--; return true; } } public class SortTreeNode { public SortTreeNode Parent; public SortTreeNode Small; public SortTreeNode Great; public string Text; public int Count; public int ID; public object Tag; } /// /// Summary description for HashTree. /// public class HashTree { public HashTreeNode Root; public bool Modified; public int Count; public HashTree() { } public void Clear() { Root = null; Count = 0; Modified = false; } public bool Add(ref string str) { int Code = str.GetHashCode(); HashTreeNode node; if(Root == null) { Root = new HashTreeNode(); node = Root; } else { node = Root; while(true) { if(node.Code == Code) return false; if(Code < node.Code) { // add the node at the small branch if(node.Small == null) { node.Small = new HashTreeNode(); node = node.Small; break; } node = node.Small; } else { // add the node at the great branch if(node.Great == null) { node.Great = new HashTreeNode(); node = node.Great; break; } node = node.Great; } } } node.Code = Code; this.Modified = true; this.Count++; return true; } public void Open(string fileName, System.Text.Encoding code) { FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader reader = new StreamReader(stream, code); string str; while((str = reader.ReadLine()) != null) { string[] strCols = str.Split('\t'); if(strCols.Length > 0) this.Add(ref strCols[0]); } reader.Close(); stream.Close(); } } public class HashTreeNode { public HashTreeNode Small; public HashTreeNode Great; public int Code; } }