- 投稿日:2020-08-03T17:12:25+09:00
【Java】IteratorでList/Mapの中身を表示する!
目次
- 初めに
- Iterator(イテレータ)って何
- List系のIterator
- Map系のIterator
- ジェネリクス表現から拡張for文へ
- まとめ
- おわりに
初めに
JavaでMap/Listを触ってると、
- Listの要素すべてに対してなんかしたい!
- Mapの要素すべてに対して反復的に処理したい!
っていう瞬間が少なからずあると思います。そんなときに便利なのが今回のIterator(イテレータ)です。
実際のコードと一緒ににまとめたので参考にしてください。
※本文中のコード内におけるクラス名/変数名等は適宜読み替えてください。
※一部メインメソッド表記を省略している部分もあります。
※修正/改善点等あればおしえていただければと思います。Iterator(イテレータ)って何
定義
イテレータ(英語: iterator)とは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。JISでは反復子(はんぷくし)と翻訳されている。 wikipedia
上記の通り、配列やそれに準ずるデータに対して、繰り返し処理を行うためのインターフェースのことをIteratorと呼ぶ。
Iteratorのメソッド
Iteratorクラスには以下2つのメソッドが宣言されている。
- next()
- 繰り返し処理で次の要素を返す。
- hasNext()
- 繰り返し処理でさらに要素がある場合に true を返す。
- remove()
- 基になるコレクションから、反復子によって最後に返された要素を削除する。(任意のオペレーション)
覚えなくていい覚えてもいい上の2つが重要で、繰り返し処理では主にnext()とhasNext()を使う
他クラスでIteratorを使用する場合はメソッドをオーバーライドして使用する。
remove()の「任意のオペレーション」は、「Iteratorが呼ばれるオブジェクトにによってはサポートしていないものもある」の意味。記法
使用時は
Iterator<参照するオブジェクトの型>オブジェクト名
でインスタンス化する以下で実際にそれぞれのクラスでの使用方法を確認する。
List系のIterator
ListクラスにはIteratorインターフェースが実装されているため、メソッドを呼び出すだけでIteratorを取得できる。
Listクラス詳細(オラクルHP)IteratorDemo.javapublic void IteratorDemo(){ // リスト作成 List<String> list = new ArrayList<String>(); list.add("イヌ"); list.add("サル"); list.add("キジ"); // イテレータ取得、メソッド呼び出し Iterator<String> itList = list.iterator(); // 表示 while (itList.hasNext()){ String s = itList.next(); System.out.println(s); } }実行結果: イヌ サル キジMap系のIterator
MapクラスにはIteratorインターフェースが実装されていないため、一度Iteratorインターフェースが実装されているクラス型のオブジェクトにしてからIteratorを取得する。
IteratorDemo.java// マップ作成 // Map<Character, String> map = new HashMap<Character, String>(); map.put('A', "あるふぁ"); map.put('B', "ぶらぼー"); map.put('C', "ちゃーりー"); // イテレータ取得、メソッド呼び出し // // keySet()でSet型オブジェクトとしてキー一覧を取得 Iterator<Character> itMapKey = map.keySet().iterator(); // values()でCollection型オブジェクトとして値一覧を取得 Iterator<String> itMapValue = map.values().iterator(); // entrySet()でSet<Map.Entry<K, V>型オブジェクトとしてキーと値の組み合わせを取得 Iterator<Map.Entry<Character, String>> itEntry = map.entrySet().iterator(); // 表示 // while (itMapKey.hasNext()){ char key = itMapKey.next(); System.out.println(key); } while (itMapValue.hasNext()){ String value = itMapValue.next(); System.out.println(value); } while(itEntry.hasNext()){ Map.Entry<Character, String> entry = itEntry.next(); System.out.println(entry); }実行結果: A B C あるふぁ ぶらぼー ちゃーりー A=あるふぁ B=ぶらぼー C=ちゃーりージェネリクス表現から拡張for文へ
上記コード例ではジェネリクス"<>"を使った出力を行ったが、拡張for文を用いるこもできる。
List/Mapそれぞれのfor文での出力方法は以下。//表示結果は「Map系のイテレータ」部のコードと同じ // Listの中身すべてを表示 for (String value : list){ System.out.println(value); } // Mapのキーをすべて表示 for (char key : map.keySet()){ System.out.println(key); } //マップの値をすべて表示 for (String value : map.values()){ System.out.println(value); } //マップのキーと値の組み合わせ(エントリ)をすべて表示 for (Map.Entry<Character, String> entry : map.entrySet()){ System.out.println(entry); }まとめ
- List系クラスはそのままIteratorを使用可能
- Map系クラスは、値をIteratorが実装されている型のオブジェクトへ変換してから使う。
- Map系のそれぞれの値取り出し時に使うメソッドは以下
ほしい要素 メソッド名 戻り値 キーの一覧 map.keySet() Set型 値の一覧 map.values() Collection型 キーと値の組み合わせ一覧 map.entrySet() Collection<Entry<K, V>>型 終わりに
ここまで読んでいただきありがとうございます。
まだまだ触れられてない部分もあるのでいつかまとめられたらな~とか思います。
「自作クラスにIerator実装する」みたいな記事もちらほら見かけたのでそっちもいつかはまとめてみたいですね。
では。
- 投稿日:2020-08-03T17:12:25+09:00
【Java】IteratorでList/Mapの中身を表示する
目次
- 初めに
- Iterator(イテレータ)って何
- List系のIterator
- Map系のIterator
- ジェネリクス表現から拡張for文へ
- まとめ
- おわりに
初めに
JavaでMap/Listを触ってると、
- Listの要素すべてに対してなんかしたい!
- Mapの要素すべてに対して反復的に処理したい!
っていう瞬間が少なからずあると思います。そんなときに便利なのが今回のIterator(イテレータ)です。
実際のコードと一緒ににまとめたので参考にしてください。
※本文中のコード内におけるクラス名/変数名等は適宜読み替えてください。
※一部メインメソッド表記を省略している部分もあります。
※修正/改善点等あればおしえていただければと思います。Iterator(イテレータ)って何
定義
イテレータ(英語: iterator)とは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。JISでは反復子(はんぷくし)と翻訳されている。 wikipedia
上記の通り、配列やそれに準ずるデータに対して、繰り返し処理を行うためのインターフェースのことをIteratorと呼ぶ。
Iteratorのメソッド
Iteratorクラスには以下2つのメソッドが宣言されている。
- next()
- 繰り返し処理で次の要素を返す。
- hasNext()
- 繰り返し処理でさらに要素がある場合に true を返す。
- remove()
- 基になるコレクションから、反復子によって最後に返された要素を削除する。(任意のオペレーション)
覚えなくていい覚えてもいい上の2つが重要で、繰り返し処理では主にnext()とhasNext()を使う
他クラスでIteratorを使用する場合はメソッドをオーバーライドして使用する。
remove()の「任意のオペレーション」は、「Iteratorが呼ばれるオブジェクトにによってはサポートしていないものもある」の意味。記法
使用時は
Iterator<参照するオブジェクトの型>オブジェクト名
でインスタンス化する以下で実際にそれぞれのクラスでの使用方法を確認する。
List系のIterator
ListクラスにはIteratorインターフェースが実装されているため、メソッドを呼び出すだけでIteratorを取得できる。
Listクラス詳細(オラクルHP)IteratorDemo.javapublic void IteratorDemo(){ // リスト作成 List<String> list = new ArrayList<String>(); list.add("イヌ"); list.add("サル"); list.add("キジ"); // イテレータ取得、メソッド呼び出し Iterator<String> itList = list.iterator(); // 表示 while (itList.hasNext()){ String s = itList.next(); System.out.println(s); } }実行結果: イヌ サル キジMap系のIterator
MapクラスにはIteratorインターフェースが実装されていないため、一度Iteratorインターフェースが実装されているクラス型のオブジェクトにしてからIteratorを取得する。
IteratorDemo.java// マップ作成 // Map<Character, String> map = new HashMap<Character, String>(); map.put('A', "あるふぁ"); map.put('B', "ぶらぼー"); map.put('C', "ちゃーりー"); // イテレータ取得、メソッド呼び出し // // keySet()でSet型オブジェクトとしてキー一覧を取得 Iterator<Character> itMapKey = map.keySet().iterator(); // values()でCollection型オブジェクトとして値一覧を取得 Iterator<String> itMapValue = map.values().iterator(); // entrySet()でSet<Map.Entry<K, V>型オブジェクトとしてキーと値の組み合わせを取得 Iterator<Map.Entry<Character, String>> itEntry = map.entrySet().iterator(); // 表示 // while (itMapKey.hasNext()){ char key = itMapKey.next(); System.out.println(key); } while (itMapValue.hasNext()){ String value = itMapValue.next(); System.out.println(value); } while(itEntry.hasNext()){ Map.Entry<Character, String> entry = itEntry.next(); System.out.println(entry); }実行結果: A B C あるふぁ ぶらぼー ちゃーりー A=あるふぁ B=ぶらぼー C=ちゃーりージェネリクス表現から拡張for文へ
上記コード例ではジェネリクス"<>"を使った出力を行ったが、拡張for文を用いるこもできる。
List/Mapそれぞれのfor文での出力方法は以下。//表示結果は「Map系のイテレータ」部のコードと同じ // Listの中身すべてを表示 for (String value : list){ System.out.println(value); } // Mapのキーをすべて表示 for (char key : map.keySet()){ System.out.println(key); } //マップの値をすべて表示 for (String value : map.values()){ System.out.println(value); } //マップのキーと値の組み合わせ(エントリ)をすべて表示 for (Map.Entry<Character, String> entry : map.entrySet()){ System.out.println(entry); }まとめ
- List系クラスはそのままIteratorを使用可能
- Map系クラスは、値をIteratorが実装されている型のオブジェクトへ変換してから使う。
- Map系のそれぞれの値取り出し時に使うメソッドは以下
ほしい要素 メソッド名 戻り値 キーの一覧 map.keySet() Set型 値の一覧 map.values() Collection型 キーと値の組み合わせ一覧 map.entrySet() Collection<Entry<K, V>>型 終わりに
ここまで読んでいただきありがとうございます。
まだまだ触れられてない部分もあるのでいつかまとめられたらな~とか思います。
「自作クラスにIerator実装する」みたいな記事もちらほら見かけたのでそっちもいつかはまとめてみたいですね。
では。
- 投稿日:2020-08-03T17:12:25+09:00
【Java】IteratorでList/Mapの要素を取得する
目次
- 初めに
- Iterator(イテレータ)って何
- List系のIterator
- Map系のIterator
- ジェネリクス表現から拡張for文へ
- まとめ
- おわりに
初めに
JavaでMap/Listを触ってると、
- Listの要素すべてに対してなんかしたい!
- Mapの要素すべてに対して反復的に処理したい!
っていう瞬間が少なからずあると思います。そんなときに便利なのが今回のIterator(イテレータ)です。
実際のコードと一緒ににまとめたので参考にしてください。
※本文中のコード内におけるクラス名/変数名等は適宜読み替えてください。
※一部メインメソッド表記を省略している部分もあります。
※修正/改善点等あればおしえていただければと思います。Iterator(イテレータ)って何
定義
イテレータ(英語: iterator)とは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。JISでは反復子(はんぷくし)と翻訳されている。 wikipedia
上記の通り、配列やそれに準ずるデータに対して、繰り返し処理を行うためのインターフェースのことをIteratorと呼ぶ。
Iteratorのメソッド
Iteratorクラスには以下2つのメソッドが宣言されている。
- next()
- 繰り返し処理で次の要素を返す。
- hasNext()
- 繰り返し処理でさらに要素がある場合に true を返す。
- remove()
- 基になるコレクションから、反復子によって最後に返された要素を削除する。(任意のオペレーション)
覚えなくていい覚えてもいい上の2つが重要で、繰り返し処理では主にnext()とhasNext()を使う
他クラスでIteratorを使用する場合はメソッドをオーバーライドして使用する。
remove()の「任意のオペレーション」は、「Iteratorが呼ばれるオブジェクトにによってはサポートしていないものもある」の意味。記法
使用時は
Iterator<参照するオブジェクトの型>オブジェクト名
でインスタンス化する以下で実際にそれぞれのクラスでの使用方法を確認する。
List系のIterator
ListクラスにはIteratableインターフェースが実装されているため、メソッドを呼び出すだけでIterator型のオブジェクトを取得できる。
Listクラス詳細(オラクルHP)IteratorDemo.javapublic void IteratorDemo(){ // リスト作成 List<String> list = new ArrayList<String>(); list.add("イヌ"); list.add("サル"); list.add("キジ"); // イテレータ取得、メソッド呼び出し Iterator<String> itList = list.iterator(); // 表示 while (itList.hasNext()){ String s = itList.next(); System.out.println(s); } }実行結果: イヌ サル キジMap系のIterator
MapクラスにはIteratorインターフェースが実装されていないため、一度Iteratorインターフェースが実装されているクラス型のオブジェクトにしてからIteratorを取得する。
IteratorDemo.java// マップ作成 // Map<Character, String> map = new HashMap<Character, String>(); map.put('A', "あるふぁ"); map.put('B', "ぶらぼー"); map.put('C', "ちゃーりー"); // イテレータ取得、メソッド呼び出し // // keySet()でSet型オブジェクトとしてキー一覧を取得 Iterator<Character> itMapKey = map.keySet().iterator(); // values()でCollection型オブジェクトとして値一覧を取得 Iterator<String> itMapValue = map.values().iterator(); // entrySet()でSet<Map.Entry<K, V>型オブジェクトとしてキーと値の組み合わせを取得 Iterator<Map.Entry<Character, String>> itEntry = map.entrySet().iterator(); // 表示 // while (itMapKey.hasNext()){ char key = itMapKey.next(); System.out.println(key); } while (itMapValue.hasNext()){ String value = itMapValue.next(); System.out.println(value); } while(itEntry.hasNext()){ Map.Entry<Character, String> entry = itEntry.next(); System.out.println(entry); }実行結果: A B C あるふぁ ぶらぼー ちゃーりー A=あるふぁ B=ぶらぼー C=ちゃーりージェネリクス表現から拡張for文へ
上記コード例ではジェネリクス"<>"を使った出力を行ったが、拡張for文を用いるこもできる。
List/Mapそれぞれのfor文での出力方法は以下。//表示結果は「Map系のイテレータ」部のコードと同じ // Listの中身すべてを表示 for (String value : list){ System.out.println(value); } // Mapのキーをすべて表示 for (char key : map.keySet()){ System.out.println(key); } //マップの値をすべて表示 for (String value : map.values()){ System.out.println(value); } //マップのキーと値の組み合わせ(エントリ)をすべて表示 for (Map.Entry<Character, String> entry : map.entrySet()){ System.out.println(entry); }まとめ
- List系クラスはそのままIteratorを使用可能
- Map系クラスは、値をIteratorが実装されている型のオブジェクトへ変換してから使う。
- Map系のそれぞれの値取り出し時に使うメソッドは以下
ほしい要素 メソッド名 戻り値 キーの一覧 map.keySet() Set型 値の一覧 map.values() Collection型 キーと値の組み合わせ一覧 map.entrySet() Collection<Entry<K, V>>型 終わりに
ここまで読んでいただきありがとうございます。
まだまだ触れられてない部分もあるのでいつかまとめられたらな~とか思います。
「自作クラスにIterator実装する」みたいな記事もちらほら見かけたのでそっちもいつかはまとめてみたいですね。
では。
- 投稿日:2020-08-03T17:12:21+09:00
【Java】組み合わせを実装してみた。
数学の組み合わせを Java で実装してみた
異なるn個の中から異なるr個とる組み合わせを Java で実装してみました。
r個の数だけループする実装は見たことがありますが、
r個が変わっても大丈夫なようにしたくていろいろ考えました。ソースコード
下記コードは 5個 の中から 3個 とるようになっています。
import java.util.ArrayList; import java.util.List; public class Trial { public static void main(String[] args) { Trial me = new Trial(); me.exec(args); } public void exec(String[] args) { // 文字列の配列 String[] strArray = new String[] { "a", "b", "c", "d", "e" }; // 組み合わせを取得 String[][] combinations = getCombinations(strArray, 3); // 結果出力 for (String[] combination : combinations) { for (String str : combination) { System.out.print(" " + str); } System.out.println(); } } private String[][] getCombinations(String[] strArray, int selectCount) { // 結果を詰める用のリスト List<String[]> list = new ArrayList<>(); // ちょいちょい使うので変数に保持 int len = strArray.length; // 配列の長さから2進数での最大値を求める。 int dec = 0; for (int i = 0; i < len; i++) { dec += Math.pow(2, i); } // 最大値からデクリメントしていく。 for (int num = dec; 0 < num; num--) { // 2進数表記の文字列にする。(0埋めはされない) String bin = Integer.toBinaryString(num); if (!isCombination(bin, selectCount)) { // 1 の数が選択数と一致しない場合は無視する。 continue; } int j = bin.length() - 1; int tmplen = len - bin.length(); String[] combination = new String[selectCount]; int idx = selectCount - 1; for (int i = len - 1; tmplen <= i; i--) { if (bin.charAt(j--) == '1') { combination[idx--] = strArray[i]; } } list.add(combination); } return list.toArray(new String[0][0]); } private boolean isCombination(String str, int selectCount) { int sum = 0; for (int i = 0; i < str.length(); i++) { sum += Character.getNumericValue(str.charAt(i)); } if (sum == selectCount) { return true; } return false; } }実行結果
a b c a b d a b e a c d a c e a d e b c d b c e b d e c d e5個から3個をとる組み合わせは、5! / (2! * (5 - 2)!) = 10
たぶん合ってる。最後に
パフォーマンスや大きな数字を扱うことを考えると改善の余地は大いにあると思います。
以上
- 投稿日:2020-08-03T17:09:58+09:00
spring + gradle でhelloworldを表示してみる【初心者がTODOアプリを作るまで#4】
Javaの環境構築をしてhelloworldを出力するではまずは書いてみるということでhelloworldをコンソールに出力しました。
今回はもう少し先に進んでspringのプロジェクトでHTMLを表示させてみます。springなんてまだいれてないよ~というかたは前回までの記事を参考にしていただければと思います。
Eclipseにspring bootとgradleを追加する
Eclipseにプラグインをインストールするspringのプロジェクトをつくってみる
まずはspringプロジェクトを作ってみましょう。
1.[file] => [new] => [Other] => [Spring Starter Project] を選択
2.プロジェクトやパッケージの名前を決めます。今回はhelloSpringとしました。
依存関係ってなに?
4で記述した依存関係についてです。正直よくわかってませんが、使いたいSpringフレームワークをここで選ぶということみたいです。Gradleさんにこれよろしく~と頼むものを選ぶイメージですかね。Gradleの設定ファイルをいじることで後から追加もできます。
(認識が違ったら教えていただけますと幸いです)作成したプロジェクトの中を見てみます。
Gradleの設定ファイルはbuild.gradle
になってますのでこれを開いてみます。buid.gradleplugins { id 'org.springframework.boot' version '2.3.2.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { /*追加されている↓*/ implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web-services' developmentOnly 'org.springframework.boot:spring-boot-devtools' /*追加されている↑*/ testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } test { useJUnitPlatform() }依存関係の選択時に選んだ4つが追加されていますね。
このあたりは私もまだまだ知識が足りないのでいつかまとめたいと思います。helloworldを出力する
プロジェクトができたので出力してみましょう。ファイルを2つ追加します。追加後はこんな感じ。
1.HTML追加
基本的に
src/main/resources
内のtemplates
にHTMLファイルを置きます。
templates右クリック => [New] => [Other] よりHTMLファイル、helloを作成します。hello.html<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>hello</title> </head> <body> <h1>Hello World!!</h1> </body> </html>2.Controller追加
helloSpring.Controller
というパッケージを追加し、その中にHelloController.java
を作成します。HelloController.javapackage helloSpring.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class HelloController { @RequestMapping(value = "/", method = RequestMethod.GET) public String hello() { return "hello"; } }ここで注意すべきなのはControllerを作る場所です。
プロジェクトのmainメソッドのHelloSpringApplication.java
がある起動クラスと同一パッケージ、もしくはその配下に配置しないと正しくロードされず404エラーになります。
helloSpring
パッケージ内に作成してもいいですし、今回紹介したようにController用のパッケージを追加する場合はパッケージ名に注意してください。Controllerってなにしてるの?
Webフレームワークで一般的に取り入れられているアプリケーション設定を整理するための概念の一つでMVCというものがあるのですがそのCの部分です。なんのこっちゃと思いますが細かいことは後日まとめますので今は簡単に説明します。
HTMLをただ作っただけでは画面に表示させられないので、表示してくれるところが必要です。Controllerは、このURLが来たらこの処理をしてほしいという内容を書くところです。
コードの内容を見てみる
まず@がついているものはアノテーションといいます。アノテーションとは注釈の意味です。
@Controllerと書くことでこのクラスはControllerだよ~と宣言しています。
@RequestMapping ではどういうリクエストが来たら~の処理を書きます。importはこれらを使うために書いています。
今回のコードを上から(@Controllerから)言葉で説明すると、
これはControllerのHelloControllerクラスです。
"/"というURLのGETリクエストがきたらhelloという関数を実行します。
という意味です。hello関数ではhelloというファイルを返すという処理が書かれていますね。実行する
ポート番号が8080になっているのでhttp://localhost:8080にアクセスしてみます。
無事に出力できました。
次はMVCの説明と、出力する文字を動的に変えてみたいと思います。
次 => 作成中
- 投稿日:2020-08-03T16:54:31+09:00
JavaはWord文書にハイパーリンクを追加します
通常、Word文書を編集するときに、特定のテキストまたは画像にハイパーリンクを挿入すると、ユーザーが他のターゲットの場所やWebページにすばやくジャンプできるようになります。今日の記事では、Free Spire.Doc for Javaを使用して、Word文書にテキストハイパーリンクと画像ハイパーリンクを追加する方法を紹介します。
JARパッケージのインポート
方法1:Free Spire.Doc for Javaをダウンロードして解凍し、libフォルダーのSpire.Doc.jarパッケージを依存関係としてJavaアプリケーションにインポートします。
方法2:Mavenリポジトリーを介してJARパッケージをインストールし、pom.xmlファイルを以下のように構成します<repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.doc.free</artifactId> <version>2.7.3</version> </dependency> </dependencies>Javaコード
import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.Section; import com.spire.doc.documents.HorizontalAlignment; import com.spire.doc.documents.HyperlinkType; import com.spire.doc.documents.Paragraph; import com.spire.doc.fields.DocPicture; public class InsertHyperlinks { public static void main(String[] args) { //Word文書を作成する Document doc = new Document(); Section section = doc.addSection(); //Webリンクを挿入 Paragraph paragraph = section.addParagraph(); paragraph.appendText("ウェブリンク: "); paragraph.appendHyperlink("https://www.google.com/", "ホームページ", HyperlinkType.Web_Link); //メールリンクを挿入 paragraph = section.addParagraph(); paragraph.appendText("メールリンク: "); paragraph.appendHyperlink("mailto:xxx@outlook.com", "xxx@outlook.com", HyperlinkType.E_Mail_Link); //ファイルリンクを挿入する paragraph = section.addParagraph(); paragraph.appendText("ファイルリンク: "); String filePath = "C:\\Users\\Administrator\\Desktop\\sample.pptx"; paragraph.appendHyperlink(filePath, "クリックしてレポートを開く", HyperlinkType.File_Link); //画像ハイパーリンクを挿入 paragraph = section.addParagraph(); paragraph.appendText("画像ハイパーリンク: "); paragraph = section.addParagraph(); DocPicture picture = paragraph.appendPicture("C:\\Users\\Administrator\\IdeaProjects\\Spire.Doc\\logo (2).jpg"); paragraph.appendHyperlink("https://www.google.com/", picture, HyperlinkType.Web_Link); for (int i = 0; i < section.getParagraphs().getCount(); i++) { //段落を中央揃え section.getParagraphs().get(i).getFormat().setHorizontalAlignment(HorizontalAlignment.Center); //段落の最後にスペースを自動的に追加する section.getParagraphs().get(i).getFormat().setAfterAutoSpacing(true); //ファイルに保存 doc.saveToFile("InsertHyperlinks.docx", FileFormat.Docx_2013); } } }
- 投稿日:2020-08-03T15:07:04+09:00
Eclipseにプラグインをインストールする【初心者がTODOアプリを作るまで#3】
前回の記事はこちらです。
eclipseにGradleとSpringを追加する今回はプラグインを追加しましょう。
なにかありましたらご指摘いただけますと嬉しいです。プラグインってなに?
当たり前にプラグインという言葉を見ますが超初心者からすれば「いやプラグインインストールってなんやねん」ってなりますよね(私がそうです)
プラグインとはもっといろんなことができるような拡張機能のソフトウェアのことです。
タイトルはEclipseをもっと使いやすくいろいろできるようにする機能機能を追加しましょうという意味ですね。インストールする
実際にプラグインをインストールしましょう。今回は
・Eclipse Java EE Developer Tools
・Eclipse Java Web Developer Tools
・Eclipse Web Developer Tools
・JST Server Adapters
・JST Server Adapters Extensionsを追加します。
1.[help] => [Install New Software]から入ります。
2.-- All vailable Sites --に変更し、Eclipse Java EEと入力すると画像のようになりますので、チェックが入っていることを確認して[next]
3.特にいじらず[next]を押下で大丈夫です。ライセンスの確認をされたらI acceptを選択して[finish]
4.インストールをしばらく待ち、Eclipseを再起動したら完了です。1~4の手順ですべてインストールして完了です。
この作業中は急にフリーズしたりして大丈夫か、、となりましたがあせらず待ちましょう。私も初めはえ!?となっていろいろポチポチしてしまいました。
次はspringのプロジェクトを作ってみましょう。
次 => spring + gradle でhelloworldを表示してみる
- 投稿日:2020-08-03T14:21:33+09:00
【アルゴリズム】桁の足し算
問題説明
自然数Nを受け取って、Nの各桁の足し算を行いreturnするsolutionメソッドを作成してください。
例)N=123の場合、1 + 2 + 3 = 6をreturn。条件
- Nの範囲:100,000,000以下の自然数
入出力の例
N answer 123 6 987 24 解説
※解説は私が作成したコードなので、もっといいアルゴリズム等々ありましたら、共有してください!
public class Solution { public int solution(int n) { // 合計を保存用 int sum = 0; while(n > 0) { sum += n % 10; // 10で割り算して余りを足していく。 n /= 10; // 10で割り算した結果を次の計算に使うためnに代入。 } return sum; } }
- 投稿日:2020-08-03T02:04:30+09:00
Spring+Vue.js でAPIの連携をする
はじめに
今回SpringフレームワークでRestAPIを作成し、
Vue.jsでデータを表示させることをゴールに記載していきます。
(Javaのインストール等の初期設定となる環境構築は省きます。)プロジェクト作成
◇Vue.js
VueCliを用いて作成していきます。
①VueCliをnpmよりインストールする
コンソールnpm install -g @vue-cli
②プロジェクト作成
コンソールvue create practice
実行すると、アプリケーション作成に必要な設定ファイルやサンプルソースが自動で作成されます。
③サンプル画面確認
作成したプロジェクト配下にて以下実行コンソールnpm run serve
◇Spring
「Spring Tools for Eclipse」を使用して、進めていきます。
①プロジェクト作成
「Spring Starter Project」を選択肢プロジェクトを作成するプロジェクトを作成すると以下のようなフォルダ、ファイルが作成されます。
(今回は「gradle」を使用しております。)
RestAPIの作成
H2データベースからデータを取得するAPIを作成します。
①H2データベース準備
H2データベースとは・・・・・
JAVAプラットフォーム上でオープンソースのRDB
「インメモリデータベース」として使用が可能でSpring bootではデフォルトで付属されているため複雑な設定不要
以下のJDBCドライバがすでに登録されている
今回は「インメモリデータベース」として使用するため、初期化するテーブル、データを作成していきます。
「src/main/resources」配下に「data.sql」、「schema.sql」を配置する。
アプリ起動時、インメモリデータベースのため毎回初期化されます。
初期化時には2つのSQLが自動で実行されます。
data.sql
data.sqlINSERT INTO person(code, name, belong_nm) VALUES('001', 'テスト1', '総務部'); INSERT INTO person(code, name, belong_nm) VALUES('002', 'テスト2', '人事部');
schema.sql
schema.sqlCREATE TABLE person ( id INT NOT NULL AUTO_INCREMENT, code VARCHAR(100) NOT NULL, name VARCHAR(100) NOT NULL, belong_nm VARCHAR(500) NOT NULL, PRIMARY KEY(id) );プロジェクト上で右クリックし、「Spring Boot App」にて起動する
起動後「http://localhost:8080/h2-console」
にアクセスし、テーブルが作成されていることを確認②Controller、Serviceを作成する
ControllerからServiceを呼び出します。
一旦DBの参照は行わず、固定の値を戻すようにする。固定値をListに詰めて返却します。
PracticeServiceImp.java
PracticeServiceImp.javapackage com.example.demo.service; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; @Service public class PracticeServiceImp implements PracticeService { @Override public List<String> getAll() { List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); return list; } }Service呼び、取得した値をListに詰めて、返却します。
PracticeController.java
PracticeController.javapackage com.example.demo.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.service.PracticeService; import com.example.demo.service.PracticeServiceImp; @RestController @RequestMapping("api/practice") public class PracticeController { private final PracticeService practiceService; @Autowired public PracticeController(PracticeServiceImp practiceService){ this.practiceService = practiceService; } @GetMapping public List<String> getAll() { List<String> list = practiceService.getAll(); return list; } }
実際に実行し確認していきます。
「http://localhost:8080/api/practice」
にアクセスし、固定値が表示されました。③DBから取得した値をFormクラスに格納し、returnするよう修正
DBとの接続、SQLの発行はDAOクラスに任せます。
「Controller(リクエスト、レスポンスのハンドリング)」「Service(ロジック)」「Dao(DB操作)」という役割です。
PracticeServiceImp.java
PracticeServiceImp.javapackage com.example.demo.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.dao.PracticeDao; import com.example.demo.form.PracticeForm; @Service public class PracticeServiceImp implements PracticeService { private final PracticeDao dao; @Autowired public PracticeServiceImp(PracticeDao dao) { this.dao = dao; } @Override public List<PracticeForm> getAll() { // List<PracticeForm> list = new ArrayList<>(); // // list.add("1"); // list.add("2"); // list.add("3"); return dao.getAll(); } }
PracticeController.java
PracticeController.javapackage com.example.demo.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.form.PracticeForm; import com.example.demo.service.PracticeService; import com.example.demo.service.PracticeServiceImp; @RestController @RequestMapping("api/practice") @CrossOrigin(origins = {"http://localhost:8081"}) public class PracticeController { private final PracticeService practiceService; @Autowired public PracticeController(PracticeServiceImp practiceService){ this.practiceService = practiceService; } @GetMapping public List<PracticeForm> getAll() { List<PracticeForm> list = practiceService.getAll(); return list; } }データを格納するための新規ファイル
PracticeForm.java
PracticeForm.javapackage com.example.demo.form; import javax.validation.constraints.NotNull; public class PracticeForm { public PracticeForm() {}; public PracticeForm(int id, String code, String name, String belong_nm) { super(); this.id = id; this.code = code; this.name = name; this.belong_nm = belong_nm; } @NotNull private int id; @NotNull private String code; @NotNull private String name; @NotNull private String belong_nm; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBelong_nm() { return belong_nm; } public void setBelong_nm(String belong_nm) { this.belong_nm = belong_nm; } }DB操作するための新規ファイル
PracticeDaoImp.java
PracticeDaoImp.javapackage com.example.demo.dao; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import com.example.demo.form.PracticeForm; @Repository public class PracticeDaoImp implements PracticeDao { private final JdbcTemplate jdbcTemplate; @Autowired public PracticeDaoImp(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public List<PracticeForm> getAll() { // TODO Auto-generated method stub String sql = "select id, code, name, belong_nm from person"; List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql); List<PracticeForm> list = new ArrayList<PracticeForm>(); for(Map<String, Object> result : resultList) { PracticeForm practiceForm = new PracticeForm(); practiceForm.setId((int)result.get("id")); practiceForm.setCode((String)result.get("code")); practiceForm.setName((String)result.get("name")); practiceForm.setBelong_nm((String)result.get("belong_nm")); list.add(practiceForm); } return list; } }DBの値が取得できております。
Vue.jsからAPIを実行
フロントエンド側からAPIを呼び出しデータを表示させます。
①axiosをインストール
APIを実行するために「axios」を使用します。
axios:HTTP通信が可能なJavaScriptのライブラリコンソールnpm install --save axios
②axiosでAPIを呼び出す。
※VueもSpringもサーバーを起動させておく。
axiosにて、APIのURLを指定しデータを取得する。
Home.vue
Home.vue// Home.vue <template> <div> {{ people }} </div> </template> <script> import axios from 'axios' export default { data () { return { people: [] } }, methods: { getPerson () { const path = 'http://localhost:8080/api/practice' axios.get(path) .then(response => { this.people = response.data }) .catch(error => { console.log(error) }) } }, created () { this.getPerson() } } </script>データが取得されました。
③テーブルに表示させる
UIフレームワーク「vuetify」のデータテーブルを用いて、画面をそれっぽく加工してみます
Person.vue
Person.vue// Person.vue <template> <div> <h1>社員一覧</h1> <v-data-table :headers="headers" :items="people"> </v-data-table> </div> </template> <script> import axios from 'axios' export default { components:{ }, data () { return { people: [], singleSelect: false, selected: [], headers: [ { align: 'start', sortable: false, }, { text: 'ID', value: 'id' }, { text: '氏名', value: 'name' }, { text: '社員コード', value: 'code' }, { text: '所属名', value: 'belong_nm' }, ], } }, methods: { getNews () { const path = 'http://localhost:8080/api/practice' axios.get(path) .then(response => { this.people = response.data }) .catch(error => { console.log(error) }) } }, created () { this.getNews() } } </script>データテーブルを使って表示させることで、簡単にそれっぽいものが表示されました。
まとめ
簡単なAPIを作成しそれをフロントエンドと連携させることができました。
いまどきのフレームワークのおかげでどこにどういうロジックを書くかがだいたい決まっております。
そのため、役割もはっきりし便利ですね。参考文献
参考にさせていただきました。
https://b1tblog.com/2020/03/17/spring-rest-2/