Java

列挙子の実装を反復子のインタフェイスで扱う #3

EnumerationにとってのIterableはないためenumeration(Iterable)に相当するものは作れないが、 対称性を考えてEnumerationからIterableを生成するiterableメソッドを書いてみる。 メソッドは#1のiteratorメソッドと同じクラス内で定義する。 import java.uti…

なんだか不思議なJDK6とJDK7との差異

内部クラスのメソッドからアウタークラスの同名異シグニチャのメソッドを呼び出す際の、 JDK6とJDK7でのコンパイラの振る舞いの違いについて。 以下でのJDKのバージョンはJDK6が"1.6.0_29"、JDK7が"1.7.0_01"で、ともにWindows x86版。Outerクラスは二つのク…

列挙子の実装を反復子のインタフェイスで扱う #2

使ってみる。 以下は例によってiteratorメソッドを定義しているクラス内で定義されたメソッド内での例である。 クラス外で使うのならiteratorメソッドが定義されているクラス名を付けてiterator()を呼び出す必要がある。 もう一つ、Vectorの生成にJDK7で導入…

列挙子の実装を反復子のインタフェイスで扱う #1

ついでなので逆にEnumerationからIteratorを得る方向も書いてみる。 import java.util.Enumeration; import java.util.Iterator; import java.util.NoSuchElementException; ...snip public static <E> Iterator<E> iterator(final Enumeration<E> enumeration) { ret</e></e></e>…

反復子の実装を列挙子のインタフェイスで扱う #6

Iterableではないが、配列の要素を列挙するEnumerationも得られるといいかもしれない。 ...snip import java.util.NoSuchElementException; ...snip public static <E> Enumeration<E> enumeration(final E[] array) { return new Enumeration<E>() { private int ind</e></e></e>…

反復子の実装を列挙子のインタフェイスで扱う #5

#3の使用例では結局Collectionに対するEnumerationを得ていたのであまりありがたみがない気が。 Iterable由来でない(当然Collection由来でない)Iteratorを与えてみる。 import java.util.Enumeration; import java.util.Iterator; ...snip for ( Enumerati…

反復子の実装を列挙子のインタフェイスで扱う #4

このenumeration(Iterator)はもっと簡潔に書くことができた。 ...snip public static <E> Enumeration<E> enumeration(final Iterator<E> iterator) { return new Enumeration<E>() { public boolean hasMoreElements() { return iterator.hasNext(); } public E nextEle</e></e></e></e>…

反復子の実装を列挙子のインタフェイスで扱う #3

#1の最初のコードを汎用的にする。 import java.util.Enumeration; import java.util.Iterator; ...snip public static <E> Enumeration<E> enumeration(final Iterator<E> iterator) { return new Enumeration<E>() { private Iterator<E> iter = iterator; public boolean</e></e></e></e></e>…

反復子の実装を列挙子のインタフェイスで扱う #2

Collectionを実装するクラスが持つ要素を列挙するEnumerationが欲しい場合はCollections.enumeration(Collection)がまさに適任で、 これは実質的にCollectionから得られるIteratorをEnumerationとしてアクセスすることに他ならない。 が、Collectionから得ら…

反復子の実装を列挙子のインタフェイスで扱う #1

列挙子Enumerationは古くからあったため反復子Iteratorが登場してからもEnumerationを要求するものはなくなったわけではない。 Iteratorの実装が与えられていた場合に、それをEnumerationとしてアクセスすることを考える。 これは単純にIteratorの実装に委譲…

正方形の周長 #15

日本語化用のファイルに不備があって必要なキー文字列に対応するものが存在しない場合、 例えば、SquareParametersResources_ja.propertiesのgui.side.labelの行をコメントアウトすると、 SquareParametersResources_ja.properties (試験的に一時変更) # gui…

正方形の周長 #14

SquareParametersPaneによって表に出ないSquareParametersの例外メッセージも確認してみる。 ...snip try { new SquareParameters().setSide(-1); } catch (IllegalArgumentException e) { System.err.println(e); } ...snip を日本語環境で実行すると、 jav…

正方形の周長 #13

日本語化してみる。 キー文字列と日本語メッセージの対応付けをしたファイルを用意する。 SquareParametersResources_ja.properties.txt gui.side.label = 一辺の長さ gui.perimeter.label = 周の長さ model.side.exception.message = 一辺の長さとして {0} …

正方形の周長 #12

次は多言語への対応を行ってみる。つまり言語に依存した情報を外へ放り出す。 Javaにはi18n向けの機構が標準で用意されているので楽ができる。 まず、言語に依存した情報を提供するためのクラスSquareParametersResを作る。 import java.util.ResourceBundle…

正方形の周長 #11

せっかくGUI部品化したのでアプリケーションだけでなくアプレットでも使ってみる。 import java.awt.FlowLayout; import javax.swing.JApplet; public class SquarePerimeterApplet extends JApplet { public SquarePerimeterApplet() { setLayout(new FlowL…

正方形の周長 #10

SquareParametersPaneを利用してSquarePerimeterを書くと、 import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class SquarePerimeter implements Runnable { public void run() { JFrame f = new JFram…

正方形の周長 #9

今度はSquarePerimeterで定義されているトップレベルウインドウとその中身を分離して、 中身のGUIの方をJPanelを継承したSquareParametersPaneクラスとしてコンポーネント化する。 といってもSquarePerimeterでは中身の方の定義が大部分を占めているので#8の…

正方形の周長 #8

SquareParametersインスタンスへの参照を持ち、 正方形の諸元に関することはそれに委譲するようにSquarePerimeterクラスを変更する。 ...snip public class SquarePerimeter implements Runnable, ActionListener, FocusListener { private SquareParameters…

正方形の周長 #7

一つで全てをこなせるクラスができあがってよきかなよきかな。 というわけで今度は無駄にたくさんのクラスを作って混沌へと還元していく。 まずは正方形の諸元を表現するクラスを定義する。 public class SquareParameters { private double side = 0; publi…

正方形の周長 #6

二つのJTextFieldの値の一方から他方を変更できるようにしたが、それが原因の問題が発生する。 JTextFieldに入力した値の確定はActionEventの発生(Enterキーの押下)によって行われるよう実装している。 もし確定時に数値に変換できない入力であった場合は…

正方形の周長 #5

これまでと逆で、周の長さから辺の長さが得られるようにも変更する。 どちらの長さもJTextFieldで入力し、一方が変更されればもう一方をそれに合わせて変更する。 ...snip public class SquarePerimeter implements Runnable, ActionListener { private JTex…

正方形の周長 #4

辺の長さが負なのは変なので、この場合も変更を無効にする。 辺の長さが0の正方形は正当なのかというのは微妙な問題だが、ここではありということで。 ...snip public void actionPerformed(ActionEvent e) { try { double s = Double.parseDouble(((JTextFi…

正方形の周長 #3

ラベルを付けて何のフィールドであるかを表示する。 とりあえずレイアウトマネージャには配置が楽なGroupLayoutで。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.GroupLayout; import javax.swing.GroupL…

正方形の周長 #2

この話題における目的や目標は設定していない。 思いつくままにお気楽にソースを弄っていくだけなので、 飽きたりして投げ出す可能性も含めて最終的にどうなるか分からない。とりあえず数値でないものが入力されたときにエラーを吐かないように修正。 ...sni…

正方形の周長 #1

最近Javaの話題が無かったのでしばらくJava関係を。 Update 1が出ていたのでJDK7をインストールした。 大きな言語仕様の変化は8に先送りされたのでとりあえずUpdateが一つ出るまで入れてなかった。というわけでJava SE 7の話とは全然無関係に正方形の一辺の…

Javaからgnuplotを使う

Javaからコマンドを与えgnuplotにチャートを描かせてJava側でそれを表示する。 コマンドとチャートデータの授受は標準入出力を使用する。 チャートデータはPNG形式を利用する。 ついでに、標準エラーから得られる-オプション付きgnuplotからのメッセージも表…

文字列中の数字部分列を数値として比較する #6

前述のような比較結果がほしい場合は、 数字部分列が数値として等しいが長さが異なればその差を比較結果として扱う、 という部分を変えて、長さが異なってもさらに後続部分を比較するようにすればいい。 後続部分に差が無ければ長さに差が出た最も語頭に近い…

当然、長い文字列の比較に失敗するComparator

char単位でStringを比較する普通のComparator。ただし、再帰版。 手元の環境では1000 chars長なら通るが、 10000 chars長同士の比較ではStackOverflowErrorが投げられる。 RecursiveComparator.java public class RecursiveComparator implements java.util.…

文字列中の数字部分列を数値として比較する #5

DecimalMixComparatorの比較結果は少し違和感を感じる場合があるかもしれない。 数字列を一個の仮想文字として扱っており、 一個以上の0が先行する数字列が同じ値を表現している場合は、 全体が長い方が大きい仮想文字であると定義していることによる。 値の…

文字列中の数字部分列を数値として比較する #4

Comparator全体を実装してみた。 各文字についてどちらか一方が非数字なら普通に一文字単位の比較をすればいい。 両方が数字の時だけ非負整数値としての比較を開始する。 文字といっても正確には文字単位でなくchar単位なので2 charで一文字のものには対応し…