From 83d089e471156868417b272b41c54ea3c5b6299e Mon Sep 17 00:00:00 2001 From: thadh Date: Sun, 8 Mar 2009 22:20:30 -0700 Subject: [PATCH] go --- .../hughes/android/dictionary/Dictionary.java | 133 ++++++++++++------ src/com/hughes/android/dictionary/Entry.java | 65 ++++++--- 2 files changed, 140 insertions(+), 58 deletions(-) diff --git a/src/com/hughes/android/dictionary/Dictionary.java b/src/com/hughes/android/dictionary/Dictionary.java index ec0d0f6..f0efe82 100755 --- a/src/com/hughes/android/dictionary/Dictionary.java +++ b/src/com/hughes/android/dictionary/Dictionary.java @@ -1,61 +1,110 @@ package com.hughes.android.dictionary; -import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.List; -import com.hughes.util.FileUtil; -import com.hughes.util.LRUCacheMap; +import com.hughes.util.CachingList; +import com.hughes.util.raf.FileList; +import com.hughes.util.raf.RAFFactory; +import com.hughes.util.raf.RAFSerializable; +import com.hughes.util.raf.RAFSerializableSerializer; +import com.hughes.util.raf.RAFSerializer; -public final class Dictionary { - - public static final String INDEX_FORMAT = "%s_index_%d"; - - private final byte lang; - private final File dictionaryFile; - private final RandomAccessFile dictionaryRaf; - private final Index index; +public final class Dictionary implements RAFSerializable { - private final LRUCacheMap positionToRow = new LRUCacheMap(2000); + static final RAFSerializer ENTRY_SERIALIZER = new RAFSerializableSerializer(Entry.RAF_FACTORY); + static final RAFSerializer ROW_SERIALIZER = new RAFSerializableSerializer(Row.RAF_FACTORY); + static final RAFSerializer INDEX_ENTRY_SERIALIZER = new RAFSerializableSerializer(IndexEntry.RAF_FACTORY); - public Dictionary(final String dictionaryFileName, final byte lang) - throws IOException { - this.lang = lang; - this.dictionaryFile = new File(dictionaryFileName); + final List entries; + final Language[] languages = new Language[2]; + + Language activeLanguage = null; - dictionaryRaf = new RandomAccessFile(dictionaryFile, "r"); - index = new Index(String.format(INDEX_FORMAT, dictionaryFile - .getAbsolutePath(), lang)); + public Dictionary(final String lang0, final String lang1) { + languages[0] = new Language(lang0); + languages[1] = new Language(lang1); + entries = new ArrayList(); } - public int numRows() { - return index.root.getDescendantCount(); + public Dictionary(final RandomAccessFile raf) throws IOException { + entries = CachingList.create(FileList.create(raf, ENTRY_SERIALIZER, raf.getFilePointer()), 10000); + languages[0] = new Language(raf); + languages[1] = new Language(raf); + } + public void write(RandomAccessFile raf) throws IOException { + FileList.write(raf, entries, ENTRY_SERIALIZER); + languages[0].write(raf); + languages[1].write(raf); } - public Row getRow(final int position) throws IOException { - Row row = positionToRow.get(position); - if (row == null) { - final Object o = index.root.getDescendant(position); - if (o instanceof Integer) { - final Entry entry = new Entry(FileUtil.readLine(dictionaryRaf, (Integer) o)); - row = new Row(entry.getFormattedEntry(lang), false); - } else if (o instanceof String) { - row = new Row((String) o, true); - } else { - throw new RuntimeException(o.toString()); - } - positionToRow.put(position, row); - } - return row; + static final class Language implements RAFSerializable { + final String symbol; + final List rows; + final List sortedIndex; + + public Language(final String symbol) { + this.symbol = symbol; + rows = new ArrayList(); + sortedIndex = new ArrayList(); + } + + public Language(final RandomAccessFile raf) throws IOException { + symbol = raf.readUTF(); + rows = CachingList.create(FileList.create(raf, ROW_SERIALIZER, raf.getFilePointer()), 10000); + sortedIndex = CachingList.create(FileList.create(raf, INDEX_ENTRY_SERIALIZER, raf.getFilePointer()), 10000); + } + public void write(final RandomAccessFile raf) throws IOException { + raf.writeUTF(symbol); + FileList.write(raf, rows, ROW_SERIALIZER); + FileList.write(raf, sortedIndex, INDEX_ENTRY_SERIALIZER); + } } - public static class Row { - final String text; - final boolean isWord; - public Row(final String text, final boolean isWord) { - this.text = text; - this.isWord = isWord; + public static final class Row implements RAFSerializable { + final int index; + + public Row(int index) { + this.index = index; + } + + static final RAFFactory RAF_FACTORY = new RAFFactory() { + public Row create(RandomAccessFile raf) throws IOException { + return new Row(raf.readInt()); + }}; + public void write(RandomAccessFile raf) throws IOException { + raf.writeInt(index); + } + } + + public static final class IndexEntry implements RAFSerializable { + final String word; + final int startRow; + + public IndexEntry(final String word, final int startRow) { + this.word = word; + this.startRow = startRow; + } + + static final RAFFactory RAF_FACTORY = new RAFFactory() { + public IndexEntry create(RandomAccessFile raf) throws IOException { + final String word = raf.readUTF(); + final int startRow = raf.readInt(); + return new IndexEntry(word, startRow); + }}; + public void write(final RandomAccessFile raf) throws IOException { + raf.writeUTF(word); + raf.writeInt(startRow); + } + + @Override + public String toString() { + return word + "@" + startRow; } + + } } diff --git a/src/com/hughes/android/dictionary/Entry.java b/src/com/hughes/android/dictionary/Entry.java index 0c4cd60..bd000f4 100755 --- a/src/com/hughes/android/dictionary/Entry.java +++ b/src/com/hughes/android/dictionary/Entry.java @@ -1,33 +1,55 @@ package com.hughes.android.dictionary; +import java.io.IOException; +import java.io.RandomAccessFile; import java.util.regex.Pattern; -public final class Entry { +import com.hughes.util.raf.RAFFactory; +import com.hughes.util.raf.RAFSerializable; + +public final class Entry implements RAFSerializable { static final byte LANG1 = 0; static final byte LANG2 = 1; static final Pattern lineSplitPattern = Pattern.compile("\\s+::\\s+"); - String lang1 = ""; - String lang2 = ""; + final String lang1; + final String lang2; + + @Override + public boolean equals(Object o) { + if (!(o instanceof Entry)) { + return false; + } + final Entry that = (Entry) o; + return that.lang1.equals(lang1) && that.lang2.equals(lang2); + } - Entry() {} + @Override + public int hashCode() { + return lang1.hashCode() + lang2.hashCode(); + } - Entry(final String line) { - final boolean parsed = parseFromLine(line); - assert parsed; + @Override + public String toString() { + return getRawText(); } - boolean parseFromLine(final String line) { - final String[] parts = lineSplitPattern.split(line); - if (parts.length != 2) { - System.err.println("Entry:" + "Invalid line: " + line); - return false; - } - lang1 = parts[0]; - lang2 = parts[1]; - return true; + public Entry(String lang1, String lang2) { + this.lang1 = lang1; + this.lang2 = lang2; + } + + public static final RAFFactory RAF_FACTORY = new RAFFactory() { + public Entry create(RandomAccessFile raf) throws IOException { + final String lang1 = raf.readUTF(); + final String lang2 = raf.readUTF(); + return new Entry(lang1, lang2); + }}; + public void write(RandomAccessFile raf) throws IOException { + raf.writeUTF(lang1); + raf.writeUTF(lang2); } String getAllText(final byte lang) { @@ -57,5 +79,16 @@ public final class Entry { public String getRawText() { return getAllText(LANG1) + " :: " + getAllText(LANG2); } + + + + static Entry parseFromLine(final String line) { + final String[] parts = lineSplitPattern.split(line); + if (parts.length != 2) { + System.err.println("Entry:" + "Invalid line: " + line); + return null; + } + return new Entry(parts[0], parts[1]); + } } -- 2.43.0