20210917のJavaに関する記事は6件です。

Java ど初心者メモ①

ど初心者メモ: 2の2乗を8回行う。 public class Main{   public static void main(String[] args) {    int x = 1;    for(int i = 1; i <= 8; i++) {     x *= 2;     System.out.println("2の" + i + "乗は" + x );    }   } } Javaを使えるようになるのだろうか....はぁ....
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHubActionsのSelf-hosted runnerを、AWS EC2にUbuntu-20.04(amd64)で作る。

SpringBootで作っているアプリケーションを、SpringNativeでNative化しています。 Native化のハードルとして「ビルド時間が長い」ことが結構ストレスだったりします。 ローカルマシンだと、ビルドが30分近くかかったり、メモリ不足でビルド自体がエラーで落ちたりします。 AWSにビルドサーバー作ってビルド時間の短縮とかをしていたんですが、GitにPushしてビルドサーバーの方でPullしてというのがちょっと面倒。 GithubActionsでCIもしているが、どうにもこうにも遅かったり、メモリ不足でエラーになったりする。 その解決策として「Self-hosted runner」を使って強めのインスタンスでビルド時間の短縮を実現しました。 欲しい環境 ・SpringNativeでNative-Buildできる環境 ・Dockerが使える AWSで利用したUbuntuのAMI 時期によって更新されていくので日付の部分は探す際には、違う日付になっている場合があります。 ubuntu-focal-20.04-amd64-server-20210430 docker-ceインストール #docker-ce install sudo apt install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install -y docker-ce sudo systemctl enable docker sudo systemctl start docker docker実行時にsudoしなくていいように #No sudo for docker sudo gpasswd -a $USER docker ここで、設定反映のため一度ログアウトして再ログインする dockerの実行テスト #docker test docker run hello-world SpringNativeのビルド環境を作っていく 必要なライブラリ 以下のライブラリのインストールが必要でした。 #required lib sudo apt install -y zip sudo apt install -y gcc GraalのJava11を入れる sdkmanを使って入れていきます。 sdkmanについてはこちら https://sdkman.io/ #java11 graal curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk install java 21.2.0.r11-grl sdk use java 21.2.0.r11-grl gu install native-image 自分は「maven」使っているのでインストール #maven sudo apt install -y maven Self-Hosted Runnerの設定 ここまで設定したら、GitHubActionsのSelf-hosted runnerとして使う設定をします。 Githubのリポジトリで「Setting > Actions > Runners」から「Add Runner」する。 「OS」と「Archtecture」は、利用したいインスタンスに合わせて設定する。 こんな感じで設定画面が出るので適宜設定する 設定完了したら実行 ターミナルを閉じても実行され続けるように、バックグランドで実行させる。 #self hosted runner. for background. cd ~/actions-runner nohup ./run.sh & 実行されているかプロセス確認 実行されていますね。 ps -a PID TTY TIME CMD 18425 pts/0 00:00:00 run.sh 18429 pts/0 00:00:00 Runner.Listener 18445 pts/0 00:00:00 ps sshを切って、githubから稼働状況を確認します。 動いてますね 終了させたい場合はkill kill <PID> 実際にCIを動かしてみます。 GithubActionsの使い方についてはここでは話しませんので、 公式のドキュメントなど見てみてください! https://docs.github.com/ja/actions ビルド時間がどう変わったか GitHubの無料のRunnerの場合(ubuntu-20.04) 19分 ローカルよりは早いけど、メモリが足りないときはどうしようもないです。 大きなプロジェクトになると、メモリエラーでビルド自体できなくなります。 Self-hosted runnerの場合(ubuntu-20.04 c5n.4xlarge 16vCpu/32GB) 約6分(5分51秒) 結構早くなりました!このくらいなら我慢できる。 もっとハイスペックなマシンを用意してスレッド設定をもっと増やしたら、もっと早くなるかも。 最後に 今回は、「Self-hosted runner」をEC2で作っていますが、Fargateなどで必要な時だけ自動で起動するようにするのもいいかもしれませんね。 時間ができたらやってみたいと思います。 余談 「作業マシンのメモリを箱開けて増強したら?」と言われたんですが、会社のリースのマシンではそれは無理っすw
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHubActionsのSelf-hosted runnerで、SpringNativeのビルド時間を短縮する

SpringBootで作っているRestAPIアプリケーションを、SpringNativeでNative化しています。 Native化のハードルとして「ビルド時間が長い」ことが結構ストレスだったりします。 ローカルマシンだと、ビルドが30分近くかかったり、メモリ不足でビルド自体がエラーで落ちたりします。 AWSにビルドサーバー作ってビルド時間の短縮とかをしていたんですが、GitにPushしてビルドサーバーの方でPullしてというのがちょっと面倒。 GithubActionsでCIもしているが、どうにもこうにも遅かったり、メモリ不足でエラーになったりする。 その解決策として「Self-hosted runner」を使って強めのインスタンスでビルド時間の短縮を実現しました。 欲しい環境 ・SpringNativeでNative-Buildできる環境 ・Dockerが使える AWSで利用したUbuntuのAMI 時期によって更新されていくので日付の部分は探す際には、違う日付になっている場合があります。 ubuntu-focal-20.04-amd64-server-20210430 docker-ceインストール #docker-ce install sudo apt install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install -y docker-ce sudo systemctl enable docker sudo systemctl start docker docker実行時にsudoしなくていいように sudo gpasswd -a $USER docker ここで、設定反映のため一度ログアウトして再ログインする dockerの実行テスト #docker test docker run hello-world SpringNativeのビルド環境を作っていく 必要なライブラリ 以下のライブラリのインストールが必要でした。 sudo apt install -y zip sudo apt install -y gcc GraalのJava11を入れる springのドキュメントをもとにセットアップしていきます。 #java11 graal curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk install java 21.2.0.r11-grl sdk use java 21.2.0.r11-grl gu install native-image springの参考資料 sdkmanについてはこちら 自分は「maven」使っているのでインストール #maven sudo apt install -y maven Self-Hosted Runnerの設定 ここまで設定したら、GitHubActionsのSelf-hosted runnerとして使う設定をします。 Githubのリポジトリで「Setting > Actions > Runners」から「Add Runner」する。 「OS」と「Archtecture」は、利用したいインスタンスに合わせて設定する。 こんな感じで設定画面が出るので適宜設定する 設定完了したら実行 ターミナルを閉じても実行され続けるように、バックグランドで実行させる。 #self hosted runner. for background. cd ~/actions-runner nohup ./run.sh & 実行されているかプロセス確認 実行されていますね。 ps -a PID TTY TIME CMD 18425 pts/0 00:00:00 run.sh 18429 pts/0 00:00:00 Runner.Listener 18445 pts/0 00:00:00 ps 終了させたい場合はkill kill <PID> ssh接続を切って、githubからSelf-hosted runnerの稼働状況を確認します。 動いてますね 実際にCIを動かしてみます。 GithubActionsの使い方についてはここでは話しませんので、 公式のドキュメントなど見てみてください! https://docs.github.com/ja/actions ビルド時間がどう変わったか GitHubの標準のRunnerの場合(ubuntu-20.04) 約19分(18分41秒) ローカルよりは早いけど、メモリが足りないときはどうしようもないです。 大きなプロジェクトになると、メモリエラーでビルド自体できなくなります。 Self-hosted runnerの場合(ubuntu-20.04 c5n.4xlarge 16vCpu/32GB) 約6分(5分51秒) 結構早くなりました!このくらいなら我慢できる。 もっとハイスペックなマシンを用意してスレッド設定をもっと増やしたら、もっと早くなるかも。 最後に 今回は、「Self-hosted runner」をEC2で作っています。 必要に合わせて起動したり停止したりする予定ですが、Fargateなどで必要な時だけ自動で起動、終わったら終了するようにするのもいいかもしれませんね。 時間ができたらやってみたいと思います。 余談 SpringNative化したRestAPI アプリケーションの起動時間は「0.134s」と爆速。 もともとは20秒程度だったので、爆速になりました。 kubernetesでのPod起動も数秒になりました!ここはProbe設定の調整が必要です。 オートスケールやノード障害時に正常なノードでのPodの起動処理もめちゃくちゃ早くなって、提供サービスの可用性が高くなるので良さそうです! あと、「作業マシンのメモリを増強したら?」と言われたんですが、会社のリースのマシンでは箱開けちゃまずいので、それは無理っすw
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring Data Jpa Specificationを使って複数条件での検索機能を作る

概要 任意の組み合わせ条件で検索できる検索機能を作りたい。 検索条件の組み合わせの全パターンをRepositoryに書いて呼び出し側で分岐すればできるが、分岐祭りになるのでそれはやりたくない。 findByの後ろが動的に変化させられれば解決するのになぁ、と思って調べたらSpring Data Jpa Specificationを使って動的にクエリーを変化できて超便利だったのでメモ。 環境 Java 1.8 SpringBoot 2.2.1.RELEASE Thymeleaf 3.0.11.RELEASE サンプル 開始日と終了日を持つ予約情報を検索する場合のサンプル。 画面イメージ 画面のイメージはこんな感じ。 検索条件は、ユーザーID、氏名、開始日、終了日 氏名は姓/カナ姓を持っていて、どちらかに当てはまればOK 開始日は入力日付以降(入力日付含む)で検索 終了日は入力日付以前(入力日付含む)で検索 入力された項目のAND検索で検索する 例) 氏名に「山田」、開始日に「2021/04/01」を入力した場合 氏名(姓orカナ姓)が「山田」で、開始日が「2021/04/01」以降の予約データを検索結果に表示する DAO / DTO 検索対象のEntity UsrReservation.java package com.tamorieeeen.sample.dao.entity; import java.time.LocalDate; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import lombok.Getter; import lombok.Setter; /** * * @author tamorieeeen * */ @Getter @Setter @Entity public class UsrReservation { // 予約データの主キーは予約IDで、auto_incrementで自動採番 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int reservationId; // 開始日 private LocalDate startDate; // 終了日 private LocalDate endDate; // ユーザーID private int userId; // 姓 private String familyName; // カナ姓 private String familyNameRuby; } RepositoryにJpaSpecificationExecutorをextendsさせる UsrReservationRepository.java package com.tamorieeeen.sample.dao.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; import com.tamorieeeen.sample.dao.entity.UsrReservation; /** * * @author tamorieeeen * */ @Repository public interface UsrReservationRepository extends JpaRepository<UsrReservation, Integer>, JpaSpecificationExecutor<UsrReservation> { } UsrSpecificationを作成する 同様の検索機能を別Entityに対しても作る必要があり、汎用的に使いたかったのでジェネリクスにて作成。 もし汎用的にする必要がなくUsrReservationを検索するだけであればTをUsrReservationに置き換えて作成すればOKです。 UsrSpecification.java package com.tamorieeeen.sample.dao.specification; import java.time.LocalDate; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.apache.commons.lang3.StringUtils; import org.springframework.data.jpa.domain.Specification; /** * * @author tamorieeeen * */ public class UsrSpecification<T> { /** * userIdで検索 */ public Specification<T> userIdEqual(Integer userId) { return userId == null ? null : new Specification<T>() { @Override public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) { return builder.equal(root.get("userId"), userId); } }; } // 上記は従来の書き方で面倒なので以降はラムダ形式で記載 /** * familyName/familyNameRubyで検索 * -> OR検索なのでPredicate[]を使う */ public Specification<T> nameContains(String name) { return StringUtils.isEmpty(name) ? null : (root, query, builder) -> { Predicate[] predicates = { builder.like(root.get("familyName"), "%" + name + "%"), builder.like(root.get("familyNameRuby"), "%" + name + "%") }; return builder.or(predicates); }; } /** * startDateで検索 */ public Specification<T> startDateGreaterThanEqual(LocalDate startDate) { return startDate == null ? null : (root, query, builder) -> { return builder.greaterThanOrEqualTo(root.get("startDate"), startDate); }; } /** * endDateで検索 */ public Specification<T> endDateLessThanEqual(LocalDate endDate) { return endDate == null ? null : (root, query, builder) -> { return builder.lessThanOrEqualTo(root.get("endDate"), endDate); }; } } Model / Controller / Service 検索条件の受け渡しに使うModel SearchModel.java package com.tamorieeeen.sample.model; import java.time.LocalDate; import org.springframework.format.annotation.DateTimeFormat; import lombok.Getter; import lombok.Setter; /** * * @author tamorieeeen * */ @Getter @Setter public class SearchModel { private int userId; private String name; @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate startDate; @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate endDate; } 実際に検索を行うService ReservationService.java package com.tamorieeeen.sample.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import com.tamorieeeen.sample.dao.entity.UsrReservation; import com.tamorieeeen.sample.dao.repository.UsrReservationRepository; import com.tamorieeeen.sample.dao.specification.UsrSpecification; import com.tamorieeeen.sample.model.SearchModel; /** * * @author tamorieeeen * */ @Service public class ReservationService { @Autowired private UsrReservationRepository usrReservationRepository; public List<UsrReservation> getSearchReservations(SearchModel target) { // userIdが0の場合は初期値なので検索対象外 Integer userId = target.getUserId() == 0 ? null : target.getUserId(); UsrSpecification<UsrReservation> spec = new UsrSpecification<>(); return usrUsrReservationRepository.findAll( Specification.where(spec.userIdEqual(userId)) .and(spec.nameContains(target.getName())) .and(spec.startDateGreaterThanEqual(target.getStartDate())) .and(spec.endDateLessThanEqual(target.getEndDate()))); } } 呼び出しController ReservationController.java package com.tamorieeeen.sample.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import com.tamorieeeen.sample.model.SearchModel; import com.tamorieeeen.sample.service.ReservationService; /** * * @author tamorieeeen * */ @Controller public class ReservationController { @Autowired private ReservationService reservationService; /** * 検索画面 */ @GetMapping("/reservation/search") public String search(Model model) { model.addAttribute("target", new SearchModel()); return "search"; } /** * 検索結果 */ @GetMapping("/reservation/search/result") public String searchResult(Model model, @ModelAttribute("target") SearchModel target) { model.addAttribute("reservations", reservationService.getSearchReservations(target)); return "search/result"; } } フロント側 検索画面のThymeleaf search.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="common :: meta_header('検索',~{::link},~{::script},~{::meta})"> <link rel="stylesheet" href="/css/search.css" /> <script src="/js/search.js"></script> </head> <body> <h1>tamorieeeen</h3> <h2>検索ページサンプル</h3> <div class="search_zone"> <h3>検索</h3> <form th:action="@{/reservation/search/result}" method="get" th:object="${target}" name="search_box"> <div class="flex_container"> <div class="flex_item"> <span class="search_item">ユーザーID</span><br> <input type="text" th:field="*{userId}" /> </div> <div class="flex_item"> <span class="search_item">氏名/カナ(姓)</span><br> <input type="text" th:field="*{name}" /> </div> </div> <div class="flex_container"> <div class="flex_item"> <span class="search_item">契約開始日(以降)</span><br> <input type="date" th:field="*{startDate}" th:value="*{startDate}" /> </div> <div class="flex_item"> <span class="search_item">契約終了日(以前)</span><br> <input type="date" th:field="*{endDate}" th:value="*{endDate}" /> </div> </div> <div class="button_area"> <button type="button" onclick="formClear();">クリア</button> <button type="submit"><img src="/img/search.svg"> 検索</button> </div> </form> </div> </body> ※検索結果のthymeleafは検索結果のリストを表示するだけなので省略 ※headerは共通化しているので気になる人は Thymeleafでヘッダーフッターを共通化する方法 をどうぞ ※CSSは省略 フォームクリア用のjs search.js function formClear() { const elms = document.forms['search_box'].elements; for (let i = 0; i < elms.length; i++) { if (elms[i].type == "text" || elms[i].type == "date") { elms[i].value = ""; } } } 参考 Spring Data JPA の Specificationでらくらく動的クエリー Spring Data Jpa Specification で OR 検索する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Eclipseプラグイン開発:右クリックしたときのポップアップメニューへ自作アクション追加

目次 1.はじめに 2.目的 3.注意点 4.開発環境 5.依存関係 6.拡張 7.拡張要素詳細 8.終わり 9.参考サイト はじめに 大学の卒業研究でEclipseのプラグインを作成した際に調べたことを書き残した記事です 自分と同じく研究のツールとしてプラグインを利用したい人や、自身の開発環境をよくするためにオリジナルのコマンドを作りたいという人に役立つ記事になればと思います 文章を読み飛ばして画像だけ見た方が直感的でわかりやすいかもしれません 目的 独自のコマンドやアクションをポップアップメニューに追加すること 実装後の画面は以下のようになります Qiita:Sample2をクリックすると自作の機能が使えるイメージです 注意点 Eclipseのダウンロードやプラグインプロジェクトの作成方法については記述しません 参考サイトにリンクをはっておきますのでそちらをご覧ください 開発環境 Windows10 Home Eclipse Photon Java 1.8 プロジェクト名 Sample 依存関係 Eclipseのプラグインを開発していくには依存関係を知ることが重要です 依存関係とは自作プラグインの拡張元のプラグインのことを指します 本記事の目的はアクションの追加を行うことなので以下の依存関係を plugin.xml->依存関係 に追加します - org.eclipse.ui 拡張 依存関係を追加したらプラグインの拡張を行っていきます plugin.xml->拡張 依存関係でorg.eclipse.uiを追加したのでそこから以下の3つを拡張していきます org.eclipse.ui.menus menus:右クリックを押したときのポップアップを拡張するのに必要 org.eclipse.ui.commands commands:何かしらの操作(ボタン操作やショートカットキー)などによって呼びされる動作を拡張する org.eclipse.ui.handlers handlers:対応するコマンドの具体的な処理をHandlerクラスとして対応付けを行う 拡張要素詳細 plugin.xml->拡張タブの右側、拡張要素詳細について3つの拡張ポイントを個別に説明 org.eclipse.ui.menus org.eclipse.ui.menusにマウスを合わせ右クリック->新規->menuContribution menuContributionのlocationURIの欄にpopup:org.eclipse.ui.popup.any?after=copyを入力、他の欄はそのまま org.eclipse.ui.menusの後に段でpopup:org.eclipse.ui.popup.any?after=copy(menuContribution)ができるはずなので マウスを合わせ右クリック->新規->menu を押すとlabel(menu)が生成される label(menu)の要素詳細にあるlabel*:に入力した文字は右クリックしたときのコピーとか切り取りの欄に表示される文字です ほかの欄は使いません 次に、もう1つmenuContributionを生成します。新しく作ったmenuContributionのlocationURIには popup:先ほど作ったmunuのID?after=additions を入力 例)popup:Sample.popuup.menu?after=additions 新しく作ったmenuContributionを右クリック->commandをクリックしてcommandを生成 commandIDにはorg.eclipse.ui.commandsで作るcommandのIDを入力します label:menuで入力したlabelの後にでてくる表示名になります。目的のところで見せた実装画面のQiita.Samplse2の箇所 id:プロジェクト名.pupup.自由 org.eclipse.ui.commands org.eclipse.ui.commandsを右クリック->category をクリックし生成されたものにid*:を割り振ります id:プロジェクト名.カテゴリー名が一般的な命名規則だそうです 例)Sample.category1 name*:に関しては右クリックのポップアップでは関係ないので飛ばします 次にorg.eclipse.ui.commandsを右クリック->command でcommandを生成します id:プロジェクト名.command.自由    name:自分でわかりやすいコマンド名を付けます categoryId:は重要です、先で作ったcategoryのIdと同じものを欄に記入してください 参照ボタンからcategoryIdを記入すれば入力ミスはなくなるので便利です 以下のようにcategoryIdがあっていれば大丈夫です org.eclipse.ui.handlers org.eclipse.ui.handlersを右クリック->handler をクリックしhandler生成します handlerのcommandIdにはorg.eclipse.ui.commandsで作ったcommandのIdを入れます 次にclass:をクリックしhandlerクラスを作ります 注意することは、handler専用パッケージを作りIHandlerをimplementsすることです ボタンが押されたときの具体的な処理はexecuteメソッドに書きます ※isEnabled と isHandledメソッドのfalseはtrueに変えておかないとクリックしても反応しないので注意 SampleHandler.java package handler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.commands.IHandlerListener; public class SampleHndler implements IHandler { @Override public void addHandlerListener(IHandlerListener handlerListener) { // TODO 自動生成されたメソッド・スタブ } @Override public void dispose() { // TODO 自動生成されたメソッド・スタブ } @Override public Object execute(ExecutionEvent event) throws ExecutionException { // TODO 自動生成されたメソッド・スタブ //クリックされたときの具体的な処理を記述 return null; } @Override public boolean isEnabled() { // TODO 自動生成されたメソッド・スタブ return true; } @Override public boolean isHandled() { // TODO 自動生成されたメソッド・スタブ return true; } @Override public void removeHandlerListener(IHandlerListener handlerListener) { // TODO 自動生成されたメソッド・スタブ } } 終わり 以上で右クリックしたときに出るポップアップにコマンドを追加する方法は終わりです 初めて記事を書いたので文章がおかしいと思いますがわからないことがあったら連絡してください 反応があったらもしくは暇だったら、ツールバーへボタンを用いたアクション追加の仕方を記事にしたいと思います ありがとうございました 参考サイト commandやhandlerの書き方で参考になります -> 拡張:org.eclipse.ui.commands - - 開発メモ ポップアップやツールバーを拡張したい時に参考になります -> EclipseプラグインCommandサンプル
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【LeetCode】アルゴリズム体操 9. Palindrome Number

9. Palindrome Number 問題文 Given an integer x, return true if x is palindrome integer. An integer is a palindrome when it reads the same backward as forward. For example, 121 is palindrome while 123 is not. 超訳 与えられたint xが回文ならtrueを返してくれよな! ちな121は回文で、123は回文ちゃうよ。 解答 Stringで確認する Solution.java class Solution { public boolean isPalindrome(int x) { String original = String.valueOf(x); String reversed = new StringBuilder().append(x).reverse().toString(); return original.equals(reversed); } } intで頑張る Solution.java class Solution { public boolean isPalindrome(int x) { int num = x, reversed = 0; while (num > 0) { reversed = (reversed * 10) + (num % 10); num /= 10; } return x == reversed; } } マイナスの時は無条件falseになるので、while内を通らないかつfalseを返すのでよし! としていいのか、最初に明示的にif文ではじいた方がいいのか…。でもif文を入れると実行速度が若干落ちるしなぁと。 このアルゴリズム問題を解く時、先輩方の場合はどうしますか。コメントいただけると幸いです。 実行結果 Title Runtime Memory Stringで確認 14ms 42.9MB intで頑張る 11ms 41.2MB ひとこと 最近Java Silverを取得して、勉強が落ち着いたので新しい方面の勉強をしたいなと思って手を出しました。 まだまだひよっこですが頑張るドン!!!!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む