20210724のJavaに関する記事は4件です。

【Java】AtCoderのABC-211に参加しました(レート:214→205)。

絶不調ですが、今回もA,BのみでC突破できずでした。 レートは214→205。ついに200を切ってしまう直前まで来てしまいました。 A問題 入力値A,Bを使って、(a-b)%3+bを求める。 割り切れる場合は整数を、そうでない場合は小数点下を求めるような例題になっていたため、出力時に分岐を入れました。 import java.util.Scanner; import java.util.Arrays; public class Main{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); if((a-b)%3!=0){ System.out.println((double)(a-b)/3+b); }else{ System.out.println((a-b)/3+b); } } } B問題 入力する4つの文字列に、H , 2B , 3B , HR が1つずる存在するか。 簡単なはずが、2回WAを出してしまいました。 ・文字列を配列として入力 ・ソート ・文字列が、H , 2B , 3B , HRの順で格納されていれば"Yes"を出力。 import java.util.Scanner; import java.util.Arrays; public class Main{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); String s[] = new String[4]; char flg = '0'; // H , 2B , 3B , HR for(int i=0;i<4;i++){ s[i] = sc.next(); //if(s[i].equals("H")||s[i].equals("2B")||s[i].equals("3B")||s[i].equals("HR")){ //}else{ //flg = '1'; //} } Arrays.sort(s); for(int i=0;i<4;i++){ //System.out.println(s[i]); } if(s[0].equals("2B")&&s[1].equals("3B")&&s[2].equals("H")&&s[3].equals("HR")){ System.out.println("Yes"); }else{ System.out.println("No"); } } } 感想 伸び悩んできました。足しになるか分かりませんが過去問のC問題を繰り返し解く習慣を付けようと思います。他に資格の勉強もあるので、年内茶色が難しいかも・・。せめて300は行きたいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】Apache HttpClientの使い方メモ

Mavenプロジェクトの作成 下記の記事を参考にして、Mavenプロジェクトを作成。 mvn archetype:generate \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false \ -DgroupId=com.sample \ -DartifactId=http-client-sample pom.xmlの編集 pom.xmlを編集して、Apache HttpClientを導入します。 また、以下の記事を参考にして、mvnコマンドでの実行と実行可能JARファイル生成のための設定を追加します。 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sample</groupId> <artifactId>http-client-sample</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>http-client-sample</name> <url>http://maven.apache.org</url> <properties> <java.version>1.8</java.version> <maven.compiler.target>${java.version}</maven.compiler.target> <maven.compiler.source>${java.version}</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <!-- <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.14.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version> </dependency> --> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.0.0</version> <configuration> <mainClass>com.sample.App</mainClass> </configuration> </plugin> <!-- 実行可能jarファイル用のプラグイン --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <finalName>sample</finalName> <descriptorRefs> <!-- 依存するリソースをすべてjarに同梱する --> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.sample.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <!-- idタグは任意の文字列であれば何でもよい --> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> Javaコード 以下の記事を参考にさせていただき、GETリクエストとPOSTリクエストを行うプログラムを作成します。 App.java package com.sample; public class App { public static void main( String[] args ) { Client clinet = new Client("testId"); clinet.exec(); } } Client.java package com.sample; import org.apache.http.HttpStatus; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; public class Client { // private static final Logger logger = LogManager.getLogger(MethodHandles.lookup().lookupClass()); private String id; public Client(String id) { this.id = id; } public void exec() { // Cookieを扱うための準備 BasicCookieStore cookieStore = new BasicCookieStore(); try ( CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build(); ) { RequestConfig config = RequestConfig.custom() .setSocketTimeout(3000) .setConnectTimeout(3000) .build(); // Cookieを設定 HttpGet httpGet = new HttpGet("https://httpbin.org/cookies/set?key=" + this.id); httpGet.setConfig(config); // GETリクエストの実行 try ( CloseableHttpResponse httpResponse = httpClient.execute(httpGet); ) { if ( httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK ) { System.out.println("Cookie設定"); System.out.println(EntityUtils.toString(httpResponse.getEntity())); } else { System.out.println("エラー: " + httpResponse.getStatusLine().getStatusCode()); return; } } catch (Exception e) { throw e; } // JSONをPost HttpPost httpPost = new HttpPost("https://httpbin.org/anything"); // 文字コードを指定 httpPost.setHeader("Content-type", "application/json; charset=UTF-8"); // PostするJSON文字列のセット String json = "{\"name\":\"foo\", \"mail\":\"bar\"}"; StringEntity entity = new StringEntity(json, "UTF-8"); httpPost.setEntity(entity); // POSTリクエストの実行 try ( CloseableHttpResponse httpResponse = httpClient.execute(httpPost); ) { if( httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK ) { System.out.println("Post実行"); System.out.println(EntityUtils.toString(httpResponse.getEntity())); } else { System.out.println("エラー: " + httpResponse.getStatusLine().getStatusCode()); return; } } catch (Exception e) { throw e; } } catch (Exception e) { e.printStackTrace(); } } } APIのエンドポイントとして、httpbinというWebサービスを利用させていただきました。 実行 pom.xmlのある場所で、以下のコマンドで実行します。 mvn compile mvn exec:java 実行可能JARファイルの作成と実行は、以下のコマンドで行います。 mvn install cd target/ java -jar sample-jar-with-dependencies.jar 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JPAという便利なものがあるらしい

JPAとは Java Persistence APIの略 データベース操作を行うライブラリの一つ SQLを自動作成、実行する(→SQL文を書く必要すらない。そんな便利な世界があったとは…) とりあえずJPAを使うにあたって 従業員テーブル(従業員番号、名前、部署番号)を用意。→全部で9件用意。 JpaRepositoryが定義しているCRUD処理用のメソッドを使ってみる。→今回は検索のみ。 実行イメージ 全件検索 主キー(従業員番号)検索 部署番号検索を行う 従業員名&部署番号検索を行う 従業員名部分検索を行う Controller package jp.co.ttt.employee.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import jp.co.ttt.employee.repository.EmployeeRepository; @Controller public class EmployeeController { @Autowired EmployeeRepository repository; // 全件検索 @RequestMapping(path = "/findAll") public String showemployeeList(Model model) { model.addAttribute("employees", repository.findAll()); return "employee/employee_list"; } // 主キー(従業員番号)検索 @RequestMapping(path = "/getOne/{id}") public String showEmployee(@PathVariable int id, Model model) { model.addAttribute("employees", repository.getOne(id)); return "employee/employee_list"; } // 部署番号検索を行う @RequestMapping(path = "/findByDeptNo/{deptNo}") public String showEmpoloyeeListByDeptNo(@PathVariable int deptNo, Model model) { System.out.println(repository.findByDeptNo(deptNo)); model.addAttribute("employees", repository.findByDeptNo(deptNo)); return "employee/employee_list"; } // 従業員名&部署番号検索を行う @RequestMapping(path = "/findByNameAndDeptNo/{name}/{deptNo}") public String showEmpoloyeeListByNameAndDeptNo(@PathVariable String name, @PathVariable int deptNo, Model model) { model.addAttribute("employees", repository.findByNameAndDeptNo(name, deptNo)); return "employee/employee_list"; } // 従業員名部分検索を行う @RequestMapping(path = "/findByNameLike/{name}") public String showEmployeeListNameLike(@PathVariable String name, Model model) { model.addAttribute("employees", repository.findByNameLike("%" + name + "%")); return "employee/employee_list"; } } 全件検索、主キー検索はデフォルトで用意されている。 部署番号検索、従業員名&部署番号検索、従業員名部分検索はこちらで定義。(EmployeeRepositoryインターフェイスにて) Repository package jp.co.ttt.employee.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import jp.co.ttt.employee.entity.Employee; public interface EmployeeRepository extends JpaRepository<Employee, Integer> { // 部署番号検索 List<Employee> findByDeptNo(Integer deptNo); // 従業員名&部署番号検索 List<Employee> findByNameAndDeptNo(String name, Integer deptNo); // 従業員名部分検索 List<Employee> findByNameLike(String name); } 検索したい文字列 or 数値を引数で渡している。 findBy[検索条件]で定義する→[findBy]に続くフィールド名、キーワードに応じた条件検索を実行する。 Entity package jp.co.ttt.employee.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import lombok.Data; // name属性はテーブル名 @Data @Entity @Table(name = "employee") public class Employee { // 主キーの列は@Id @Id private Integer id; // 主キー以外の列は@Column @Column private String name; // 主キー以外の列は@Column @Column private Integer deptNo; } @Table→エンティティとテーブルを対応づけている。 主キーの列に対応しているフィールドは@ID 主キー以外の列に対応しているフィールドは@Column HTML <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>従業員情報</title> </head> <body> <h1>従業員情報</h1> <table border="1"> <tr> <th>従業員番号</th> <th>従業員名</th> <th>部署番号</th> </tr> <tr th:each="employee:${employees}"> <td th:text="${employee.id}"></td> <td th:text="${employee.name}"></td> <td th:text="${employee.deptNo}"></td> </tr> </table> </body> </html> メソッド確認用のHTML テーブルに格納している従業員情報の表示 従業員番号、従業員名、部署番号の表示 ソースコード ふりかえり 簡易なSQL文だったらJPAを利用すると良いことがわかった 他の用意されているupdate、insert、deleteについてもメモを残しておこうと感じた 次の記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Android】 TextWatcherを使って、金額入力時にカンマを加える。

今回の目的 EditTextで金額を入力する時、月並みだが、動的に入力した数値をカンマ区切りに変換できないか、 色々調べたところ、ある程度制御が出来るようになったので、紹介していこうと思います。 使用する環境 AndroidStudio Ver 3.4.1 Android 10.0 (Q) API 29 TextWatcher TextWatcher (AndroidDeveloper) ⇨ EditTextの入力を監視するEventListener(編集前の値を取得したり、編集後の値やポジションを取得する等、出来る) 色々詳しいことは、参考サイトや↑のリファレンスを参照してください。 実装に当たって まずはImplements(実装)していきます。 MainActivity.java public class SampleClass1 extends AppCompatActivity implements TextWatcher その後、エラーが出て、「専用のクラスをOverRideせよ」と言われるのでどこかに以下のクラス群を設置します。 MainActivity.java @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { } とここまでは、調べると色々出てくるので、詳しい内容は参考サイトを見てみてください。 実装 では実際に実装していきます MainActivity.java @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { //入力直後のテキストを取得 if (!chg_flg){ prevText = charSequence.toString(); } } @Override public void onTextChanged(CharSequence charSequence, int cur, int del, int add) { try { if (chg_flg) { return; } //変更途中はスルー StringBuilder str_claft = new StringBuilder(); String str = charSequence.toString(); //カンマを消そうとしているかチェックする if (!this.CheckInputCash(prevText, str)) { //カンマ手前の数字を削除する cur -= 1; str_claft.append(str); str_claft.deleteCharAt(cur); str = str_claft.toString(); } //ここでflgを立てておく //この対策をしておかないと、後々2重で呼び出されることになってめんどくさい。 chg_flg = true; //ここでカンマを一旦外す。 str = str.replace(",", ""); int kngk = 0; String tmp_kngk = ""; //現在のカーソル位置を編集用変数に格納。 int sel_pos = cur; //文字数が3文字以上の場合、カンマ区切りに整形する。 if (str.length() > 3) { kngk = Integer.parseInt(str); tmp_kngk = String.format("%,d", kngk); } else { //0からスタートの場合は、「0」を削除する。 if (prevText.equals("0")) { str = str.replace("0", ""); } tmp_kngk = str; } if (cur == 0 && del != 0 && tmp_kngk.length() == 0) { //削除時、0桁になる場合は「0」をセットする。 tmp_kngk = "0"; sel_pos = 1; } else { //追加時、追加後の文字数によってPostionを移動する。 if (del == 0){ if (tmp_kngk.length() == 9 || tmp_kngk.length() == 5) { // 特定の文字数の時は+2      ex)1,234,567 or 1,234 sel_pos += 2; } else { // それ以外は+1 sel_pos += 1; } } } //範囲以上になる場合は、末尾にPostionをセット。 if (sel_pos > tmp_kngk.length()) { sel_pos = tmp_kngk.length(); } //新規と編集でEditTextの参照先が変わる場合は、MODE管理をしておく。 //変わらないであれば、if文自体が要らない。 if (form_mode.equals("00")){ INPUT_KNGK.setText(tmp_kngk); INPUT_KNGK.setSelection(sel_pos); }else if(form_mode.equals("01")){ EDIT_KNGK.setText(tmp_kngk); EDIT_KNGK.setSelection(sel_pos); } //終わったら、flgを戻す chg_flg = false; } catch (Exception e) { e.printStackTrace(); } } @Override public void afterTextChanged(Editable editable) { try{ if (!chg_flg){return;} //変更途中はスルー String str = editable.toString(); //ここでチェック機能を走らせることも出来る。 if (str.length() > 11){ MSGFORM1.setVisibility(View.VISIBLE); ERRMSG1.setVisibility(View.VISIBLE); ERRMSG1.setText("入力できる桁数を超えています。9桁以内で入力してください。"); }else{ MSGFORM1.setVisibility(View.GONE); ERRMSG1.setVisibility(View.GONE); } } catch (Exception e) { e.printStackTrace(); } } MainActivity.java /** 削除対象がカンマかどうかチェックする **/ public boolean CheckInputCash(String before,String after){ boolean result = true; try{ String str_before = before.replace(",",""); String str_after = after.replace(",",""); if (str_before.length() == str_after.length()){ //カンマ外して文字数が一緒ならば、カンマを削除しようとしている result = false; }else{ result = true; } } catch (Exception e) { e.printStackTrace(); } return result; } ポイント カンマ区切りに整形する場合、カーソルの持って行き場を指定しないといけないので、そこが大変。 カーソルがカンマに当たっている状態で削除キーを押すと、後の方にカーソルが当たってしまうので、制御してあげないといけない。 というより、何が一番大変ってカーソルの位置指定のめんどくささ。 チェック機能をつけるであれば、「afterTextChanged()」で行う。 それ以外だと、変な感じの挙動になる。 EditTextはPrivateで扱えるように定義してあげないといけない。 整形後の内容を入れるため。 終わりに どうでしょうか? カーソルの扱い方は慣れないと難しいですが、デバッグして引数の値を見ていくと、色々掴めてきます。 他のサイトで見るよりかは簡単に実装できたように感じますが、他に何か参考になりそうなサイトがあれば、ぜひコメントください。 それでは、また。 参考サイト 入力を監視するTextWatcher/nyanのアプリ開発 個人的にはここのサイトがオススメです。(わかりやすい) TextWatcherでリアルタイムに値を取得する方法(Android)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む