using System;
// Huom! C#:n ja Javan säiliöluokat ovat lähes identtiset nimiä myöten!
using System.Collections;
namespace stream
{
///
/// lukee dataa |-erotetusta syötteestä, esimerkki säiliöiden käytöstä
///
/// Miika Nurminen, 16.9.2004
public class Lukija : Filter {
// ArrayList, joka sisältää string-taulukoita (string[])
private ArrayList content = new ArrayList();
private ContentComparer comparer;
public Lukija(int fieldNum) {
comparer = new ContentComparer(fieldNum);
}
public string processLine(string s) {
/* C#:ssä ei ole StringTokenizer-luokkaa, mutta split-metodi
ajaa saman asian */
char[] separators = {'|'};
string[] values = s.Split(separators);
content.Add(values);
return null;
}
public string getResult() {
sort();
return ToString();
}
///
/// Vertailijaluokka. Huom. C#:ssä sisäluokat eivät pääse
/// automaattisesti ulkoisen luokan tietoihin, kuten Javassa.
///
public class ContentComparer : IComparer {
private int field;
public ContentComparer(int num) {
fieldNum = num;
}
public int Compare( Object x, Object y ) {
string[] a = (string[])x;
string[] b = (string[])y;
return a[fieldNum].CompareTo(b[fieldNum]);
}
// Esimerkki propertysta
public int fieldNum {
get { return field; }
set { field = value; }
}
}
private void sort() {
content.Sort(comparer);
}
///
/// järjestää taulukon n:nnen kentän mukaan. huom. ei turvallinen
/// (ei rajatarkastuksia) - lisäksi tietoja luettaessa kenttien
/// määrä voi vaihdella.
///
public void sortByField(int i) {
comparer.fieldNum = i;
sort();
}
///
/// summaa n:nnen kentän. huom, oletuksena on, että kenttä
/// sisältää numerotietoa. ei rajatarkistuksia!
///
public int sumByField(int i) {
int result = 0;
foreach (String[] s in content) {
try {
result += Convert.ToInt32(s[i]);
}
catch (Exception e) {
Console.Error.WriteLine(e.Message);
}
}
return result;
}
///
/// Syrjäytetään yläluokan ToString
///
///
/// Taulukon merkkijonoesitys
///
public override string ToString() {
// StringBuilder == Javan StringBuffer
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (String[] s in content) {
for (int i=0; i0) sb.Append('|');
sb.Append(s[i]);
}
sb.Append('\n');
}
return sb.ToString();
}
}
}