Aikの技術的な進捗部屋

技術的な進捗とか成果とかを細々と投稿するブログです。時々雑記も。

Javaで書く括弧検証プログラム

Javaで書く括弧検証プログラム-その2はこちら

括弧検証プログラムを作ろう

以前の記事にもちょろっと書きましたが、学校の課題で括弧検証プログラムを作る事になりました。
スクリプト言語は禁止との事で、どれで書こうか悩みましたが…。
学校で近々Javaプログラミング教室があるらしいので、予習も兼ねてJavaで作る事にしました。
※ちなみに筆者のJavaレベルは(ほぼ)0です
ついこの間、Java開発環境を整えるべくEclipseを導入しましたが…。
簡単なプログラムならIDE無しで、ターミナルからコンパイルして書こうという事で。
下記のサイトを見ながら勉強勉強…!
www.javadrive.jp

実装に向けて

今回のプログラムはスタックで挑みたいと思います。
AIZU Online JUDGEの類似問題ではスタックを使わないアルゴリズムもありましたが…。
スタックを知ってしまうと「スタックの方が格好良くできる!」と思ってしまいますね。
そして、プログラムとして一先ず実装したい機能は下記の通りです。

  • 外部のファイルを読み込む
  • 括弧対応がなされているかをスタックを用いてチェック
  • (出来ればプログラム実行時にファイルパス入力をして任意ファイルを読み込ませる様にしたい)

Javaの事をほぼノー知識で挑んだので、色々と苦労しましたが…。
大学で学んだC言語だと、スタック構造を自力で書かないといけないのでね。それに比べたら安いものですよ…。
さていよいよコード書きです!

書きながら気づいた事

プログラムを書く時に気づいた、ちょっとした小ネタなどを記します。

コンパイルはそのJavaファイルがあるフォルダで行わないといけない!

私は色んなファイルをついついフォルダ単位でまとめる癖があり…。
今回も以下のような感じでフォルダ管理していました。

  • -sample: 恒久的に使える OR 入門サイトにあったソースコードのコピペをしたプログラム置き場
  • -ex: 今回の課題プログラム OR 自力で書いたソースコードプログラム置き場

ただプログラミングしてる内に、「exのフォルダに居るけどここからsampleにあるプログラムをコンパイルしたいなー」となる事があってですね。
早速コマンドを叩くと、こんなエラーが出まして…。

Exception in thread "main" java.lang.NoClassDefFoundError: ...

何じゃこりゃと思い調べてたら、「君が作業してるフォルダにこのファイル無いからコンパイル出来ないよ」って事でした。
参照記事
異なるフォルダを跨いでコンパイル出来ないんですな…フォルダリング厨には厳しいです。

文字リテラル

大した事ない知識ですが、備忘録的な意味も込めて。
…の前にリテラルの言葉が分からないので検索。

リテラルとは、プログラムのソースコードにおいて使用される、数値や文字列を直接に記述した定数のことである。変数の対義語であり、変更されないことを前提とした値である。
リテラルとは - IT用語辞典 Weblio辞書

この情報も助かりましたが、個人的には今回勉強に使ったサイト内にあった

リテラル」 とは 「の値」
文字 - 文字列と数値 - Java入門

…が凄く分かり易かったのでこれで。
また、Javaにおいて、プログラム内で文字リテラルを扱う際はシングルクォーテーション(')で囲って表記するそうな。
こんな感じ→'a' 'あ'
また、文字リテラルはその文字の値を示すものなので、2文字以上をシングルクオーテーションで囲った時はエラーになるみたい。
こんな感じ→'ab' 'あい'
以前、ダブルクオーテーションで囲った文字とシングルクオーテーションで囲った文字の違いを耳にした気がしたのですが…。
結局自分の中であやふやになってたので、今回の勉強で整理出来ました。
(ちなみにダブルクオーテーションで囲った文字列は、「文字列リテラル」と言うそうです)

Javaでスタックを扱う時はDequeインターフェースを使う

JavaにもStackクラスはあるそうですが、どうやら古いらしく、今ではDequeクラスを使うように推奨されているそうです。
Deque (Java Platform SE 8)
Stack (Java Platform SE 8)
そしてDequeはキューにもスタックにも両方使えるものらしいです。
下記の2記事に大変お世話になりました。
d.hatena.ne.jp ※↑DequeクラスとStackクラスの比較を詳しく紹介されています
todai-neet.hateblo.jp ※↑Dequeインターフェースの使い方を紹介されています

Javaのバージョンによるsplitメソッドの違い

splitメソッドで1文字ずつ文字列を切り出す際、Java7までは

String[] array = "hoge".split("");
  →["", "h", "o", "g", "e"]

と、配列の先頭には空白が入る様になっていましたが、
Java8からは

String[] array = "hoge".split("");
  →["h", "o", "g", "e"]

と、配列の先頭から切り出した文字が入る様になったらしいです。
ちょうど自分の環境に"JDK1.6.0"と"JDK10"両方あったので試してみました。

$ echo $PATH /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin
$ java sample
hoge
["", "h", "o", "g", "e", ]
$ echo $PATH /Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home/bin
$ java sample
hoge
["h", "o", "g", "e", ]

確かに変わっています。
バージョン管理が大事になってきそうですね…。

完成しました!

色々やって何とか完成しました!
超長ったらしいコードになり…果たしてこれは良いコードだと言えるのでしょうか。
とりあえずソースコードだけ貼り付けておきます。
※長ったらしいので折りたたんでおきました

ソースコードのリーディングを碌にやってないので、こんな風になるのでしょうか。
今後はそちらの方もやりながら頑張ります!