1. ホーム
  2. ジャワ

Javaアルゴリズム競技の入出力トピック

2022-02-26 21:47:40
<パス

2020.2.23のアップデートでarrayモジュールが追加されました。


前書き

C/C++の使用からJavaの使用へ移行する過程で、大小様々な入出力問題に遭遇すると思います。それらを自分自身の学習材料としてまとめ、興味を持った友人と共有する予定です。

ファイル名の問題

コンテストに応募するコードでは、メインクラスは必ず public class Main を名前に、そして はパッケージステートメントを持つことができません を指定しないと、コンパイルエラーが発生します。
//publicを削除するか、クラス名にMainを使用しないとggになります、テスト済みですorz

基本的な入出力

コンテストを始めるにあたって、A+B問題ほど古典的な問題はないでしょう。最も基本的な入出力さえできなければ、学んだアルゴリズムをすべて使いこなすことはできない。

import java.util.*;
public class Main {

	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int a, b;
		while (cin.hasNext()) {
			a = cin.nextInt();
			b = cin.nextInt();
			System.out.println(a + b);
		}
	}
}


上記のコードは、最も基本的な入出力フレームワークを示しています。入力クラスである Scanner は java.util クラスパッケージに含まれており、最初にインポートする必要があります。

import java.util.*;


java入力では、あらかじめ作成された入力クラスオブジェクトが必要なので、一般的にはmain関数の最初の文でこのScannerクラスオブジェクトを作成し、そのオブジェクトはC/C++への愛と懐かしさの表現としてcinと名付けられています hhhh
トピックのデータ量が比較的多い場合は、2番目の初期化方法を選択すると、より効率的に実行することができます。

Scanner cin = new Scanner(System.in);
//or
Scanner cin = new Scanner(new BufferedInputStream(System.in));


タイトルに"input includes multiple sets of data up to the end of file"とあるので、C/C++形式から類推すると、以下のjavaコードがわかりやすいでしょう。

while (cin.hasNext()) //When there is still data in the input stream
{
    a = cin.nextInt();
	b = cin.nextInt();
}


1. 基本的なデータ型

これらの型は、C/C++で主に使われているもので、ぱっと見ただけで大体理解できる。

int n = cin.nextInt();//read in an integer
double d = cin.nextDouble();//read in a double precision floating point number
long l = cin.nextLong();//read in a long integer


ひとつだけ注意点があります。 Javaのmainメソッドはstatic型なので、staticキーワードでグローバル変数やメソッドを定義する必要があるんです!(笑)。

2. 配列

Javaは配列の作成に関してもC/C++と異なり、配列の作成は は、new キーワードを使用して作成し、そのための記憶領域を確保します。 が、あまり面倒ではありません。

int arr[] = new int[Size];
//or
int []arr = new int[Size];


2次元配列の初期化については、私が書いた別の記事を見てください。 Javaでの2次元配列の初期化

3.文字&amp;文字列

Scanner クラスは、1 文字の char 型に対する読み取りメソッドを提供しません。 しかし、まずnext()メソッドを呼んで1文字だけ含む文字列を読み、charAt(0)を使ってインデックス0の文字を返せば、1文字読みができるようになるのです。

char ch = cin.next().charAt(0);






文字列については、すでにjavaでStringクラスがラップされていますし、char配列を使って文字列を格納することも可能です。

String str1 = next(); //equivalent to scanf("%s",str) in C/C++; or cin>>str;
String str2 = nextLine();//equivalent to get(str2);or getline(cin,str2) in C/C++;

char s1[] = cin.next().toCharArray();//call the toCharArray() method to convert it to an array of char types
char s2[] = cin.nextLine().toCharArray();//an analogous understanding


しかし C++のように、配列の添え字を使ってStringクラスのオブジェクトの特定の文字数に直接アクセスすることはできないことに注意してください。 通常、Stringクラスのオブジェクトの特定の文字数にアクセスするにはcharAt(int index)メソッドを使用するか、char型の配列を使ってStringクラスの他のメソッドを呼び出さずに文字列を格納することができます。

4. 出力

1日の基本的な出力内容です。

System.out.println(); //equivalent to cout<. in C++
System.out.print(); //equivalent to cout in C++<<"";


ファイルに出力します。
ファイルへの出力は、次のような場合に使用できます。

  • javaのコンソールでも出力できないほどのデータ量であり、ファイルへの出力が必要な場合。
  • ブルートフォース方式でテーブルを入力すると、フォーマットによってまずファイルへの入力が必要になる。
try {
	BufferedWriter bw = new BufferedWriter(new FileWriter(new File("E://result.txt")));
	bw.write(str);//str means the contents of the written file
	bw.flush();//immediately write the data in the buffer to the data stream
	bw.close();//close the BufferedWriter stream
} catch (Exception e) {
	e.printStackTrace();
}


File(文字列パス名)です。 file クラスの初期化に使用し、pathname はファイルへのパスを表します。
FileWriter(File file); ファイル書き込みクラス FileWriter の初期化に使用し、file はファイルクラスオブジェクトを表します。


続きはこちら...