背景
いつも社長さんの使われているC#テンプレートを使っていました。
しかし、下記理由があるためJavaの勉強も兼ねて書き直してみました。
- WindowsはiMacにしかインストールしていなく帰省中はMBAしか使えない。
- Xamarinは使っていて変な感じがする(やっぱりVisual Studioがいい)。
- MBAはSSD128GBのためWindowsをインストールすると容量のやりくりが厳しい。
- Javaなら前にちょっと書いたことある(安易な考え1)。
- eclipseならMacとWindowsのどちらでも使えるので良さそう(安易な考え2)。
コード
普段、Javaで書かないので良い書き方かどうか自信ないですが、
今のところ使えているので良しとしました。
→書き直しただけでテストしてません。
eclipseだと、System.console().readLine()
が使えない?ようであるため、BufferedReader
を使いました。
また、Close()
のタイミングは、br.readLine()
の直後にやると、2回目のbr.readLine()
の時にIOException(Stream Closed)が出てしまうためObject#finalize()
が呼ばれる時にしました。
これで大丈夫か詳しい方教えてください。。。
【Java】ファイナライザ(デストラクタっぽい機能を実装する)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
private static Scanner sc;
public static void main(String[] args) {
Main instance = new Main();
sc = instance.new Scanner();
instance.solve();
}
private void solve() {
try {
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
private class Scanner {
String[] s;
int i;
BufferedReader br;
String regex = " ";
public Scanner() {
s = new String[0];
i = 0;
br = new BufferedReader(new InputStreamReader(System.in));
}
@Override
protected void finalize() throws Throwable {
try {
super.finalize();
} finally {
destruction();
}
}
private void destruction() throws IOException {
if (br != null) br.close();
}
public String next() throws IOException {
if (i < s.length) return s[i++];
String st = br.readLine();
while (st == "") st = br.readLine();
s = st.split(regex, 0);
i = 0;
return s[i++];
}
public int nextInt() throws NumberFormatException, IOException {
return Integer.parseInt(next());
}
public Long nextLong() throws NumberFormatException, IOException {
return Long.parseLong(next());
}
public Double nextDouble() throws NumberFormatException, IOException {
return Double.parseDouble(next());
}
}
}
使い方
インナークラスのScannerはC++のstd::cin
と同じような動きをします。
Scannerクラスでは、行が変わってもnext()
やnextInt()
などを呼び続けるだけで値を取得できます。
以下の入力(区切り文字は半角スペース)を読み込む際の処理をC++とJavaで記載します。
2
3 4
C++の場合
#include <iostream>
using namespace std;
int main(){
int a,b,c;
cin >> a; // a = 2
cin >> b; // b = 3
cin >> c; // c = 4
return 0;
}
Javaのテンプレートの場合(長いので読み込み部分だけ)
private void solve() {
try {
int a,b,c;
a = sc.nextInt(); // a = 2
b = sc.nextInt(); // b = 3
c = sc.nextInt(); // c = 4
} catch (Exception e) {
e.printStackTrace();
}
}
まとめ
AtCoderにJavaで参加しやすくなった。