20200803のJavaに関する記事は9件です。

【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.java
public 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実装する」みたいな記事もちらほら見かけたのでそっちもいつかはまとめてみたいですね。

では。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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.java
public 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実装する」みたいな記事もちらほら見かけたのでそっちもいつかはまとめてみたいですね。

では。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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.java
public 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実装する」みたいな記事もちらほら見かけたのでそっちもいつかはまとめてみたいですね。

では。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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  e

5個から3個をとる組み合わせは、5! / (2! * (5 - 2)!) = 10
たぶん合ってる。

最後に

パフォーマンスや大きな数字を扱うことを考えると改善の余地は大いにあると思います。

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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としました。
image.png

3.プロジェクト依存関係の選択。今回は4つ選びました。
image.png

4.finishを押下して完了。こんな感じでできました。
image.png

依存関係ってなに?

4で記述した依存関係についてです。正直よくわかってませんが、使いたいSpringフレームワークをここで選ぶということみたいです。Gradleさんにこれよろしく~と頼むものを選ぶイメージですかね。Gradleの設定ファイルをいじることで後から追加もできます。
(認識が違ったら教えていただけますと幸いです)

作成したプロジェクトの中を見てみます。
Gradleの設定ファイルはbuild.gradleになってますのでこれを開いてみます。

buid.gradle
plugins {
    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つ追加します。追加後はこんな感じ。
image.png

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.java
package 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というファイルを返すという処理が書かれていますね。

実行する

実行するとコンソールにこんな感じものが出ます。
image.png

ポート番号が8080になっているのでhttp://localhost:8080にアクセスしてみます。
image.png

無事に出力できました。

次はMVCの説明と、出力する文字を動的に変えてみたいと思います。
次 => 作成中

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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);
        }
    }
}

link.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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]image.png
3.特にいじらず[next]を押下で大丈夫です。ライセンスの確認をされたらI acceptを選択して[finish]
4.インストールをしばらく待ち、Eclipseを再起動したら完了です。

1~4の手順ですべてインストールして完了です。

この作業中は急にフリーズしたりして大丈夫か、、となりましたがあせらず待ちましょう。私も初めはえ!?となっていろいろポチポチしてしまいました。

次はspringのプロジェクトを作ってみましょう。
次 => spring + gradle でhelloworldを表示してみる

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【アルゴリズム】桁の足し算

問題説明

自然数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;
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring+Vue.js でAPIの連携をする

はじめに

今回SpringフレームワークでRestAPIを作成し、
Vue.jsでデータを表示させることをゴールに記載していきます。
(Javaのインストール等の初期設定となる環境構築は省きます。)

プロジェクト作成

◇Vue.js

VueCliを用いて作成していきます。

①VueCliをnpmよりインストールする

コンソール
npm install -g @vue-cli

②プロジェクト作成

コンソール
vue create practice

実行すると、アプリケーション作成に必要な設定ファイルやサンプルソースが自動で作成されます。
image.png
③サンプル画面確認
作成したプロジェクト配下にて以下実行

コンソール
npm run serve

image.png

◇Spring

「Spring Tools for Eclipse」を使用して、進めていきます。

①プロジェクト作成
「Spring Starter Project」を選択肢プロジェクトを作成する

image.png

プロジェクトを作成すると以下のようなフォルダ、ファイルが作成されます。
(今回は「gradle」を使用しております。)
image.png

RestAPIの作成

H2データベースからデータを取得するAPIを作成します。
①H2データベース準備
H2データベースとは・・・・・
 JAVAプラットフォーム上でオープンソースのRDB
「インメモリデータベース」として使用が可能でSpring bootではデフォルトで付属されているため複雑な設定不要
以下のJDBCドライバがすでに登録されている
image.png

今回は「インメモリデータベース」として使用するため、初期化するテーブル、データを作成していきます。
「src/main/resources」配下に「data.sql」、「schema.sql」を配置する。
アプリ起動時、インメモリデータベースのため毎回初期化されます。
初期化時には2つのSQLが自動で実行されます。
image.png

data.sql
data.sql
INSERT INTO person(code, name, belong_nm)
VALUES('001', 'テスト1', '総務部');
INSERT INTO person(code, name, belong_nm)
VALUES('002', 'テスト2', '人事部');


schema.sql
schema.sql
CREATE 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」にて起動する
image.png
起動後「http://localhost:8080/h2-console」
にアクセスし、テーブルが作成されていることを確認

Connectを選択
image.png
テーブルもデータも作成されている。
image.png

②Controller、Serviceを作成する
ControllerからServiceを呼び出します。
一旦DBの参照は行わず、固定の値を戻すようにする。

固定値をListに詰めて返却します。

PracticeServiceImp.java
PracticeServiceImp.java
package 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.java
package 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;
    }
}


実際に実行し確認していきます。
image.png

http://localhost:8080/api/practice」
にアクセスし、固定値が表示されました。

③DBから取得した値をFormクラスに格納し、returnするよう修正
DBとの接続、SQLの発行はDAOクラスに任せます。
「Controller(リクエスト、レスポンスのハンドリング)」「Service(ロジック)」「Dao(DB操作)」という役割です。

PracticeServiceImp.java
PracticeServiceImp.java
package 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.java
package 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.java
package 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.java
package 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;
    }

}

上記修正後、サイドアクセスしてみます。
image.png

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>

画面を確認する。
image.png

データが取得されました。

③テーブルに表示させる
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>

データテーブルを使って表示させることで、簡単にそれっぽいものが表示されました。
image.png

まとめ

簡単なAPIを作成しそれをフロントエンドと連携させることができました。
いまどきのフレームワークのおかげでどこにどういうロジックを書くかがだいたい決まっております。
そのため、役割もはっきりし便利ですね。

参考文献

参考にさせていただきました。
https://b1tblog.com/2020/03/17/spring-rest-2/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む