9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java】自分用AtCoderのテンプレート

Posted at

背景

いつも社長さんの使われている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】ファイナライザ(デストラクタっぽい機能を実装する)

Main.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++の場合

Main.cpp
#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のテンプレートの場合(長いので読み込み部分だけ)

Main.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で参加しやすくなった。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?