Jude take 1.2.6 リリース
このバージョンでは
- getter/setterの生成機能の追加
- グリッド表示
の改善があるとのこと。
getter/setter 生成機能を追加してほしいと要望を出したら採用された。(^^)
インスタンス名に命名する
クラス名ではなくて、プログラム内で動的に生成されるインスタンスを識別するために、インスタンス名の命名ルールを作った。
例えば、スレッドを生成するときに、そのスレッドのインスタンスに適切な命名をしておくと、Ctrl+BreakでThreadDumpを出力したときに、どのThreadが何をしているのか非常に見えやすくなる。
スタックトレースのメッセージにインスタンス名を含めると、例外が発生する原因が、全部なのか一部なのかひとつだけなのか、簡単に区別できるようになった。
もちろん、toString()でも分からないわけではないが、無意味なハッシュ値ではそのインスタンスが何者なのかは簡単には分からないし、クラスによってはたくさんの属性のすべてを文字列化して吐いてくれるので、その中からコンテキストに関する情報を探すのは一苦労だ。
かといって、toString()をオーバーライドしてしまうと、属性の情報を調べたくなったときに調べられなくなってしまう。
というわけでインスタンスに命名する、これお勧め!
CSVParser
Webで探せばどこかに転がってるんだろうと思ったけど、こんなん作った方がはやいやん!と思って、作ってみた。
作った後でGoogleで検索したけど、なかなかヒットしなかった。結局、自分で作った方が早かった。。。
import java.io.*; import java.util.StringTokenizer; import java.util.Vector; public class CSVParser { public static String parse(File f) throws IOException { Vector rows = new Vector(); BufferedReader reader = new BufferedReader(new FileReader(f)); while (reader.ready()) { String s = reader.readLine(); if (s.length() == 0) { break; } StringTokenizer st = new StringTokenizer(s, ",", true); Vector columns = new Vector(); int tokenCount = st.countTokens(); String prev = ""; //String tokens = new String[st.countTokens()]; //for (int i = 0; i < tokens.length; i++) { // tokens[i] = st.nextToken(); //} for (int i = 0; i < tokenCount; i++) { String t = st.nextToken(); if (t.equals(",")) { if (prev.equals(",")) { columns.add(""); } } else { columns.add(t); } prev = t; } String tokens = new String[columns.size()]; tokens = (String)columns.toArray(tokens); rows.addElement(tokens); } String result = new String[rows.size()]; result = (String)rows.toArray(result); return result; } }
ご自由にお使いください。
ただし、double quotation の内部をひとつのカラムとみなすような処理はないのでご注意!
とりあえず、tokens[]のある要素の先頭に「"」があったときは、最後に「"」がある要素までをくっつけてやればだいぶましになるかもね。
2004/04/02 追加
空の要素がある(カンマが複数続く)場合、空の要素が無視される問題を発見。(^^; 赤字が修正部分。