20220116のJavaに関する記事は7件です。

Excelから単体テストデータを投入する(SpringBoot + SQLServer + DBUnit)

初めに 単体テスト時のテストデータの生成・管理って、結構めんどくさいですよね。 そこで今回は、「テストデータをExcelで予め用意しておいて、テストメソッド実行時にDB登録する」ことでテストの効率化を図る仕組みを作ってみます。 既存の記事(例えばこんなの)だと、テストメソッド内で明示的にテストデータ生成を行うものが多かったのですが、これだとテストメソッドが肥大化してしまいます。 個人的にはテストメソッドの肥大化は好きじゃないので、本記事ではこれを防ぐためにspring-test-dbunitライブラリのLookUpクラスを使用することとします。 前提 使用技術 技術 バージョン 用途 Java amazon-correto 16 プログラミング言語 SpringBoot 2.6.1 Webフレームワーク SQL Server 2017-latest データベース(dockerで用意) Junit-jupiter 5.5.2 Java単体テストフレームワーク DBUnit 2.5.3 JunitにおけるDB試験を楽にしてくれるFW Spring-test-dbunit 1.1.0 SpringにおけるDBUnitお助けライブラリ 利用される主なクラス パッケージ クラス 自作orライブラリ 備考/用途 任意 テストクラス 自作 その名の通りテストクラス 任意 XlsDataSetLoader 自作 Excelファイルを読み込んでXlsDataSetを返す。AbstractDataSetLoaderクラスを継承 org.dbunit.data.set.excel XlsDataSet DBUnit Excelから取得できたテーブルのデータを保持 org.dbunit.ext.mssql InsertIdentityOperation DBUnit 自動採番されるカラムに明示的に値をInsertできるようにする com.github.springtestdbunit.annotation DatabaseOperation spring-test-dbunit テーブルに対する操作設定(INSERT/UPDATE/REFRESH/DELETE/DELETE_ALL/TRUNCATE_TABLE/CLEAN_INSERT) com.github.springtestdbunit.operation MicrosoftSqlDatabaseOperationLookup spring-test-dbunit SQLServer用のDatabaseOperationまとめ テスト対象 ユーザ情報を全件取得し、リストとして返すAPI(GETメソッド)を試験する。 DB設計 ユーザ情報テーブル カラム名 id name password created_at updated_at 型 int,IDENTITY nvarchar(50) nvarchar(50) datetime2 datetime2 データ例 1 John PASSWORD 2022-01-01 00:00:00.000 2022-01-01 00:00:00.000 Todo 1.DataSetLoaderクラスを作る Resource(=Excelファイル)をもとにXlsDataSetを返すもの XlsDataSetLoader.java public class XlsDataSetLoader extends AbstractDataSetLoader { @Override protected IDataSet createDataSet(Resource resource) throws Exception { // TODO 自動生成されたメソッド・スタブ try(InputStream inputStream = resource.getInputStream()) { return new XlsDataSet(inputStream); } } } 2.エクセルを用意 パスはsrc/test/data/ユーザ一覧取得/user.xlsx 3.テストクラス生成 テストクラス ・SpringBootTestアノテーションを付与 ・DbUnitConfigrationアノテーションで、1で作ったXlsDataSetLoaderとMicrosoftSqlDatabaseOperationLookupを設定 テストメソッド ・Testアノテーション付与 ・DatabaseSetupアノテーションで、2で作ったExcelファイルのパスとtypeを設定 ReadUserTest.java @SpringBootTest @DbUnitConfiguration( dataSetLoader = XlsDataSetLoader.class, databaseOperationLookup = MicrosoftSqlDatabaseOperationLookup.class ) @TestExecutionListeners({ DbUnitTestExecutionListener.class }) class ReadUserTest { //中略(データソース設定など) @Test @DatabaseSetup( value = { "/data/ユーザ一覧取得/user.xlsx" }, type = CLEAN_INSERT ) void データ1件() throws Exception { ResultActions results = mockMvc .perform( get("/user")) .andExpect(status().isOk()) .andDo(log()); //各種ASSERT(中略) } 4.テストを実行 テスト途中でブレークポイントを貼ってテストデータが入っていることを確認 ASSERT内容はよしなに... ハマったこと 1.自動採番カラムに明示的にデータを登録できない問題 InsertIdentityOperationクラスおよび、それを内包するLookupクラスの存在を知らなかった時の話です。 Excelから自動採番カラムに明示的にデータを登録しようとすると、以下エラーが出てしまいました。 Cannot insert explicit value for identity column in table 'user' when IDENTITY_INSERT is set to OFF. 解決策としては、そのままですがInsertIdentityOperationクラスを使うことです。(本記事では、 MicrosoftSqlDatabaseOperationLookupクラス内で使用されています) InsertIdentityOperationクラスの実装を見ると分かりますが、主キーとなるカラムがテーブルに設定されているときはSET IDENTITY_INSERT {テーブル名} ONを最初に実行するよう設定されています。ここらへん(207行目あたり)です↓ IdentityInsertOperation.java if (hasIdentityColumn) { StringBuffer sqlBuffer = new StringBuffer(128); sqlBuffer.append("SET IDENTITY_INSERT "); sqlBuffer.append(getQualifiedName(connection.getSchema(), metaData.getTableName(), connection)); sqlBuffer.append(" ON"); statement.execute(sqlBuffer.toString()) } ※自作ソースではないです。IdentityInsertOperation.java内から引用 参考:Class InsertIdentityOperation 2.意図しない行をDBUnitがテストデータと認識してしまう問題 Excelでは全てのカラムにデータを登録している(NULLではない)のにも関わらず、 非NULLカラムにNULLを挿入しようとしてSQLExcepitonが出る場合がありました。なんでやねん。 Cannot insert the value NULL into column 'id', table 'dbo.user'; column does not allow nulls. INSERT fails. ライブラリ内のコードを追いつつよく調べてみると、Excel側の書き方(?)の問題で「1行の実データ+999行の空文字データを登録する設定」になっていました。 A1セルで「command + End」(Windowsならctrl + end)を押して書類の末尾までスクロールしてみると、1000行目まで飛んでしまう場合、この書き方になっています。 解決策としては、別シートを新しく立ち上げて、データを記載し直してみたところ直りました。「command + End」では、テストデータの末尾まで飛ぶことを確認しています。 参考記事:dbunitエラー | 基礎からのJava 「空白セルに注意」段落がとても参考になりました。 もっと掘ってみたいこと ・テスト前のデータ登録だけではなく、テスト後にデータ消す時の挙動も見たい ・Excel以外(CSVとか)でも似たようなことはできるっぽいので、動かしてみたい ・そもそもExcelで予め決め打ちのテストデータを準備しておくことの是非  -システム日時と比較して期限切れが発生する日時データとかは、テスト起動時刻に対して相対的に決めてデータ登録したい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【OOP】03_カプセル化

こんにちは、コイキングです。 本記事では OOP(Object Oriented Programming == オブジェクト指向プログラミング)の説明のうち、カプセル化について、説明したいと思います。 1. カプセル化とは? カプセル化とは関りがあるデータと行為をまとめて、'クラス'という'カプセル'に盛り付け事を意味します。 実はクラス作る際に知らず知らずのうちにカプセル化をしていたとも言えます。 2. カプセル化の理由 1) コードの活用・管理 例えると犬クラスに翼という属性を定義すると、犬クラスに翼属性があるとは思えないでしょう? つまり、関りがない属性とメソッドはちゃんと活用されたり、管理されることが難しいでうs。 関りがある物だけクラスというカプセルに集めておくとソースコードを再活用・管理する事がより良くなります。 2) 情報隠蔽 クラス内に集めておいたメンバー変数とメソッドをどこにでも呼び出せるとクラスの元の設計された意図通り動作しない可能性が高くなります。この様なことを予防するための特性が情報隠蔽です。 どこにでもメンバー変数とメソッドを呼び出すのではなく必要な所で決まった方法にたけ呼出すとクラスの元の設計された意図通りに動作する可能性が高くなります。 Javaでは情報隠蔽をアクセス制御子を用いて実装できます。 ※ アクセス制御子 (1) public クラス、コンストラクター、変数、メソッドに定義可能、とこにでもアクセス可能。 (2) default アクセス制御子を定義しない状態、同じパッケージ内でアクセス可能。 (3) private コンストラクター、変数、メソッドに定義可能、同じクラス内部からでのみアクセス可能。 (4) protected コンストラクター、変数、メソッドに定義可能、同じパッケージ内 又は継承したクラスからアクセス可能。 Main public class Main { public static void main(String[] args) { Dog dog = new Dog("Mary", 200, "Akita"); Bird bird = new Bird("Wings", "Long-beak"); // public System.out.println("Dog's Name : " + dog.name); // アクセス可能。 // default //System.out.println("Dog's hp : " + dog.hp); // 同じパッケージではないためアクセス X // private // System.out.println("Bird's wing : "+bird.wing); // privateのため、アクセス X System.out.println("Bird's wing : "+bird.getWing()); // privateの場合、getメソッドを用いてアクセス // protected System.out.println("Bird's beak : "+bird.beak); // 同じパッケージのため、アクセス O } } ※ 例示コード https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/objective/basic03 ※ 韓国語のポストは以下のURLで確認できます。 https://koiking.tistory.com/89
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GraalVM(native-maven-plugin)で「JEP 290: Java Serialization Filtering」の仕組みを利用する

GraalVMのnative-imageコンパイラで生成したnative-imageの中でSerialization Filtringを利用する方法がわかったのでメモっておきます。 ビルドツール Maven(native-maven-plugin) 指定方法 buildArgsにフィルタリングルールを指定すればOK! <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>0.9.9</version> <extensions>true</extensions> <configuration> <buildArgs> <arg>-Djdk.serialFilter=com.example.entity.*;java.util.*;java.lang.*;!*</arg> </buildArgs> </configuration> <!-- ... --> </plugin>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java標準機能でHttpClient

普段はSpringBootを使った開発をしているためRestTemplateを使うのだが、いざSpringBootに依存しない実装が必要となったときに、Apache HttpClient を使わなくてもJavaの標準機能だけで簡単に実装できるようになったことを恥ずかしながら最近知ったので、昨年Java17がリリースされた今となってはもう古い記事になってしまうが、今更ながらJava標準機能でHttp通信するクライアントプログラムについて簡単にまとめておくことにした。 本記事の前提 Java11以上であること(Java8ではサポートされてない機能) サーバ側のコードは割愛 Jsonとのマッピング機能はJacksonを想定 受信するデータ型 public class ResponseDto { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String toString() { return "ResponseDto{" + "message='" + message + '\'' + '}'; } } サンプル実装 import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.UncheckedIOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.util.Map; public class Java11HttpSample { private final HttpClient httpClient; Java11HttpSample() { this.httpClient = HttpClient.newHttpClient(); } Java11HttpSample(HttpClient httpClient) { this.httpClient = httpClient; } /** * JSON文字列をGetするサンプル */ public String getJsonString() throws IOException, InterruptedException { // リクエストを作成 HttpRequest request = HttpRequest.newBuilder(URI.create("http://localhost:8080/sample/get")) .build(); // 同期API呼び出し HttpResponse<String> response = this.httpClient.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); // 受信したJSON文字列を確認 return response.body(); } /** * JSON文字列を受信してオブジェクトにマッピングする。マッピング自体はJacksonで実行する */ public ResponseDto getJsonData() throws IOException, InterruptedException { // リクエストを作成 HttpRequest request = HttpRequest .newBuilder(URI.create("http://localhost:8080/sample/get")) .build(); // 同期API呼び出し HttpResponse<ResponseDto> response = this.httpClient.send(request, responseInfo -> // 受信データをマッピングするロジック HttpResponse.BodySubscribers.mapping( HttpResponse.BodySubscribers.ofString(StandardCharsets.UTF_8), // JSONを文字列で受信して (String body) -> { // 受信した文字列をラムダの引数bodyで受け取り try { return new ObjectMapper().readValue(body, ResponseDto.class); // Jacksonでオブジェクトに変換 } catch (IOException e) { throw new UncheckedIOException(e); } }) ); System.out.println(response.body()); // body is ResponseDto return response.body(); } /** * Postのサンプル */ public void postJson() throws IOException, InterruptedException { HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("http://localhost:8080/sample/post")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString( new ObjectMapper().writeValueAsString(Map.of("key", "value")))) .build(); HttpResponse<String> httpResponse = this.httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); System.out.println(httpResponse.body()); } } テストコード 一般的に、単体テストではHttp通信する処理をモックにすると思うので、上記サンプルをMockitoでモックして(サーバ不要で)単体テストするコードも載せておく。 そのためにjava.net.http.HttpClientはコンストラクタ等で外部から設定できるように実装しておいたほうがいい。 @ExtendWith(MockitoExtension.class) public class Java11HttpTest { @Mock HttpResponse<String> httpResponseString; @Mock HttpResponse<ResponseDto> httpResponseJson; @Spy HttpClient httpClient; @Test public void getJsonStringTest() throws IOException, InterruptedException { Mockito.when(this.httpResponseString.body()).thenReturn("hello"); Mockito.when(this.httpClient.send(Mockito.any(), Mockito.any(HttpResponse.BodyHandlers.ofString().getClass()))) .thenReturn(this.httpResponseString); Assertions.assertEquals("hello", new Java11HttpSample(this.httpClient).getJsonString()); } @Test public void getJsonDataTest() throws IOException, InterruptedException { final ResponseDto expected = new ResponseDto(); Mockito.when(this.httpResponseJson.body()).thenReturn(expected); Mockito.when(this.httpClient.send(Mockito.any(), Mockito.any(HttpResponse.BodyHandler.class))) .thenReturn(this.httpResponseJson); Assertions.assertEquals(expected, new Java11HttpSample(this.httpClient).getJsonData()); } } さいごに Java8など古いJavaではjava.net.httpパッケージが提供されていないため、Apache HttpClientなどの外部ライブラリを利用したほうが簡単に実装できるが、Java11以上であれば標準機能だけで、かなりシンプルに実装できる。 また、今回は基本的なGET/POSTのサンプルのみだが、WebSocketやHTTP/2対応した通信も実装できる(詳細は以下Javadoc等を確認)ため、特にこだわりがなければ今後は標準機能の実装方法を覚えていったほうが汎用性が高いのではないかと感じた。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AtCoder Beginner Contest 235をやった(Java)

AtCoder Beginner Contest 235をやった。 記事投稿サボってました。自己満投稿ですが、これからもよろしくお願いします。 C問題はTLEになったので参考にしないでください。 ※もし、Javaで解かれた方いましたら、コメントいただきたく!! A 3つの数字の並び替え問題 詳細は例題にある通り。直感的に3回並び替えて足し算する方法が楽かなと思ったのでそれでやりました。 import java.util.*; public class Main { public static void main(String[] args) throws Exception { Scanner scan = new Scanner(System.in); String abc = scan.nextLine(); int sum = 0; for(int i = 0; i < 3; i++){ sum += Integer.parseInt(abc); abc = abc.concat(abc.substring(0, 1)); abc = abc.substring(1, 4); } System.out.println(sum); } } B 高さを求める問題、日本語にするのは難しいので詳細は問題を確認してください 制約が最大でも10^5ループとあったので、単純なforループで行けると思い決行 import java.util.*; public class Main { public static void main(String[] args) throws Exception { Scanner scan = new Scanner(System.in); int N = scan.nextInt(); int[] Hi = new int[N]; int ans = 0; for(int i = 0; i < N; i++){ Hi[i] = scan.nextInt(); if(i >= 1){ if(Hi[i-1] < Hi[i]){ ans = Hi[i]; } else { ans = Hi[i-1]; break; } } } System.out.println(ans); } } C 上にも書きましたが、参考にはしないでください。TLEがでます。 PHPなどにある連想配列ベースでやればたぶんできるんだろうなーとは思いましたがJavaのMapの使い方に挫折。。。 import java.util.*; public class Main { public static void main(String[] args) throws Exception { Scanner scan = new Scanner(System.in); long N = scan.nextLong(); long Q = scan.nextLong(); long[] aIndex = new long[(int) N]; for(int i = 0; i < N; i++){ aIndex[i] = scan.nextLong(); } for(int i = 0; i < Q; i++){ int cnt = 0; long xNum = scan.nextLong(); long kNum = scan.nextLong(); for(int j = 0; j < aIndex.length; j++){ if(aIndex[j] == xNum){ cnt++; if(cnt == kNum){ System.out.println(j+1); break; } } } if(cnt < kNum){ System.out.println(-1); } } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Spring Boot】GET・POSTの実装

最近、仕事で Spring Boot を使っているので、勉強した内容について書いていきます。 開発環境 Eclipse(日本語化プロジェクト)の最新のJava版をダウンロードして使用します。 Spring Bootを使うとなると、Eclipse Spring Tool Suite (STS)が必要になりますが、Pleiades All in One Eclipseをダウンロードすれば、既に使えるような状態になっているかと思います。 プロジェクトの作成 eclipseで workspace を開きます。 新規プロジェクト作成ウィンドウを開き、「Spring Boot スターター・プロジェクト」を作成します。 これにより、デフォルトのSpring boot プロジェクトが作成されたかと思います。 コーディング プロジェクトは作成できたので、次は Controllerを作成します。 一番最初に「Controllerを作成する」と聞いたときは、何のことを言っているんだ?と思いましたが、Spring boot では、アノテーションの@Controllerか@RestControllerが設定されたクラスを作成することが、「Controllerを作成する」ということになるそうです。 @Controllerでは@ResponseBodyを設定する必要がありますが、@RestControllerはそれが必要ないので、今回は@RestControllerを使って書いていきます。 (アノテーションとか、@Controllerの説明は、実装には影響しないかと思われるので、今回しません。機会があればそのあたりを書こうと思います。) GETメソッドには@GetMappingを設定し、POSTメソッドには@PostMappingを設定します。 説明文でごちゃごちゃ書いてもよくわからないかと思いますので、作成したコードを下記に記載しました。 ControllerA.java package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * http://localhost:8080/controller で呼び出せる */ @RestController @RequestMapping("/controller") public class ControllerA { /** * GETメソッド * http://localhost:8080/controller/get_method で呼び出せる * * @param param1 URL リクエストで ?get_param=~ で受信できるパラメータ */ @GetMapping("/get_method") public String getA(@RequestParam("get_param") String param1) { // テスト用のURL // http://localhost:8080/controller/get_method?get_param=test return "get メソッドのレスポンス_param->" + param1; } /** * POSTメソッド * * @param param1 URL リクエストで ?post_param=~ で送信できるパラメータ */ @PostMapping("/post_method") public String postMethod(@RequestParam("post_param") String param1) { // テスト用のURL // http://localhost:8080/controller/post_method?post_param=test return "POST メソッドのレスポンス_param->" + param1; } } 実行 プロジェクトの実行ですが、右クリックし、「実行」→「Spring Boot アプリケーション」で実行できます。 ・GETリクエスト コード内のコメントでも記載していますが、プロジェクトを実行した状態で、http://localhost:8080/controller/get_method?get_param=test をブラウザーで開くことで呼び出せます。 呼び出した結果は下記の様になります。 ・POSTリクエスト POST用に下記のコードを書きました。 post_test.html <!DOCTYPE html> <html lang="ja"> <form method="post" action="http://localhost:8080/controller/post_method"> <input type="text" name="post_param" value="default"> <input type="submit" value="post送信"> </form> </html> 上記のコードを貼り付けた htmlのコードを webブラウザーで表示すると下記の様になります。 「post送信」押下の結果は下記の様になります。 GETの場合と大差はないですが、POST用の結果として表示されていることがわかるかと思います。 作成したGithubリポジトリ 今回作成した内容は、下記に格納しておきました。 https://github.com/NagaJun1/test_spring_boot 終わりに Qiitaを書くのは深夜に限る! というか、深夜テンションじゃないと書けない。 日中に書くコツを教えてください(笑)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Silver SE11 4章

Java Silver SE11 4章 黒本をもとに学んだことをアウトプットしていきます。 主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。 while文 繰り返し処理に使用される構文。 条件式がtrueの間は処理を繰り返す。 中カッコ{}を省略した場合、次の1行が繰り返し処理の対象になる。 例 while public class Main { public static void main(String[] args) { int num = 0; while (num < 5) { System.out.println("num = " + num); num++; System.out.println("num++ の結果は " + num); } } } 結果 num = 0 num++ の結果 1 num = 1 num++ の結果 2 num = 2 num++ の結果 3 num = 3 num++ の結果 4 num = 4 num++ の結果 5 do-while文 while文と違い、先に処理があるので必ず1回は実行される。 中カッコ{}を省略した場合、doとwhielの間には1文のみ記述でき、2文以上はコンパイルエラーになる。 例 do-while public class Do_while { public static void main(String[] args) { int num = 0; do { //出力した後に num = num + 1 が処理される System.out.println("num = " + num++); System.out.println("num++ の結果は " + num); } while (num < 5); } } 結果 num = 0 num++ の結果は 1 num = 1 num++ の結果は 2 num = 2 num++ の結果は 3 num = 3 num++ の結果は 4 num = 4 num++ の結果は 5 for文 指定した回数だけ処理を繰り返す時に、よく使われる。 初期化文、条件文、処理内容、更新文を用いる。 例 for public class For { public static void main(String[] args) { // 順番 // 1.初期化文 int i = 0, j = 2; // 2.条件分 i < 5; // falseなら終了 // 3.繰り返し処理 System.out.println(i*j); // 4.更新文 i++ // 2.に戻る for (int i = 0, j = 2; i < 5; i++) { System.out.println(i*j); } } 結果 0 2 4 6 8 よくある間違い 初期化文 変数の宣言 複数の変数を宣言するときは、同じ型にする必要がある 初期化で宣言した変数は、for文外で使用することはできず、コンパイルエラーになる 条件文 カンマ「,」を使い複数条件を記述できない 理論演算子を使い複数条件の判定はできる 省略できる(無限ループになる) 更新文 省略できる for_エラー public class For { public static void main(String[] args) { // コンパイルエラー 変数の初期化部分を同じ型にする必要がある for (int i = 0, long j = 2; i < 5; i++) { System.out.println(i*j); } // コンパイルエラー scope外(for文外)で変数totalを使用している int a = 0; for (int b = 2, total = 0; b < 5; b++) { total = a*b; } System.out.println(total); // コンパイルエラー カンマによる複数条件は記述できない // i < 3 && j < 5 なら可能 for (int i = 0, j = 2; i < 3, j < 5; i++) { System.out.println(i++); j += i; } } } 拡張for文 for文から派生し簡単に記述できるようになっていて、 配列やコレクションの全要素に対して、処理を実行する。 (一時変数の宣言 : 配列orコレクション) を用いる。 例 拡張for public static void main(String[] args) { String [][] array = {{"A", "B", "C"},{"D", "E"}}; for (Object obj : array) { System.out.println(obj); // [Ljava.lang.String;@1dbd16a6 // [Ljava.lang.String;@7ad041f3 } int[] array1 = {1, 2, 3}; int total = 0; for (int i : array1) { System.out.println(i); // 1 2 3 を順番に表示 total += i; } System.out.println(total); // 6 // 一時変数のstrに"D"を代入している // strの参照先は変更されるが、要素は"D"に変化しない String[]array2 = {"A", "B", "C"}; for (String str : array2) { str = "D"; } for (String str : array2) { System.out.print(str); // ABC } } break while文やfor文でbreakを記述することで、繰り返し処理を中断できる。 直近のループのみが中断されるため、スコープ外のループは処理される。 例 break public class Break { public static void main(String[] args) { int num = 0; while (true) { if (num == 2){ break; } System.out.println(num); // 0 1 num++; } } } continue breakが繰り返し処理を中断し、ループから抜けるのに対して、 continueは繰り返し処理をスキップする。 例 continue public class Continue { public static void main(String[] args) { int [] array = {1, 2, 3}; int total = 0; for (int i : array) { if (i % 2 == 0) { continue; } total += i; } System.out.println(total); // 4 } } 2次元配列 配列要素が平面的に並ぶイメージ。 (個人的には数学で学んだ、x軸とy軸のような感じ) 例 2次元配列 public class For_array { public static void main(String[] args) { int array [][] = new int[][] {{1,2}, {2, 3, 4}}; int total = 0; for (int i = 0; i < array.length; i++) { for (int j = i; j < array[i].length; j++ ) { total += array[i][j]; } } System.out.println(total); // 10 // 配列要素数が異なる2次元配列 int array2 [][] = new int[][] {{1,2}, {2, 3, 4}}; System.out.println(array2.length); // 2 System.out.println(array2[0].length); // 2 System.out.println(array2[1].length); // 3 System.out.println(array2[1][2]); // 4 // イメージは縦が長い長方形 int[][] num = new int[100][3]; System.out.println(num.length); // 100 System.out.println(num[0].length); // 3 System.out.println(num[99].length); // 3 }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む