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

【Java】Mapの使い方

プログラミング勉強日記

2021年1月5日
JavaでのMapの扱い方を簡単にまとめる。

Mapとは

 Mapはキーと値の2つの要素からなる複数のデータを格納できるものである。キーは値に名前を付けるようなもので、値の1つ1つにキーが存在する。このキーと値がペアになっているのがMapの特徴である。そのため、Mapから値を探すときにキーを目印に探すことができる。

HashMapで初期化する方法

 Mapはインターフェースなので、インスタンスを生成するにはそれを実装したクラスを使用しないといけない。Mapのインスタンスを生成するのによく使われているのが、HashMapクラスである。

HashMapクラスを使って宣言する方法
Map<キーの型名, 値の型名> オブジェクト名 = new HashMap<>();

 宣言するときにはキーと値のデータ型を指定する必要がある。

サンプルコード
import java.util.HashMap;
import java.util.Map;

public class Sample {
    public static void main(String[] args) throws Exception {
        // キーをInteger、値をStringにする場合
        Map<Integer, String> map = new HashMap<>();
    }
}

Mapでよく使用するメソッド

putメソッド

 Mapにデータを追加できるメソッドで、第1引数にキー、第2引数に値を指定する。

サンプルコード
import java.util.HashMap;
import java.util.Map;

public class Sample {
           public static void main(String[] args) throws Exception {
                      Map<Integer, String> map = new HashMap<>();
                      map.put(1, "田中");
                      map.put(3, "鈴木");
                      map.put(5, "山田");
           }
}

getメソッド

 Mapに格納したデータを取得することができるメソッドで、引数にキーを指定することでそのキーの値を取得できる。

サンプルコード
import java.util.HashMap;
import java.util.Map;

public class Sample {
           public static void main(String[] args) throws Exception {
                      Map<Integer, String> map = new HashMap<>();
                      map.put(1, "田中");
                      map.put(3, "鈴木");
                      map.put(5, "山田");

                      System.out.println(map.get(1));
                      System.out.println(map.get(3));
                      System.out.println(map.get(5));
           }
}
実行結果
田中
鈴木
山田

keySetメソッド

 Mapに含まれるキーの値を返すメソッド。今回はkeySetメソッドを使ってMapのすべてのキーを出力する方法を紹介する。

サンプルコード
import java.util.HashMap;
import java.util.Map;

public class Sample {
           public static void main(String[] args) throws Exception {
                      Map<Integer, String> map = new HashMap<>();
                      map.put(1, "田中");
                      map.put(3, "鈴木");
                      map.put(5, "山田");

                      for(Integer key:map.keySet()) {
                                 System.out.println(key);
                      }
           }
}
実行結果
1
3
5

valuesメソッド

 valuesメソッドは、定義したMapや列挙子をまとめて受け取ることができる。Mapの値を全て取得する場合はvaluesメソッドを使う。

サンプルコード
```java:サンプルコード
import java.util.HashMap;
import java.util.Map;

public class Sample {
           public static void main(String[] args) throws Exception {
                      Map<Integer, String> map = new HashMap<>();
                      map.put(1, "田中");
                      map.put(3, "鈴木");
                      map.put(5, "山田");

                      for(String values: map.values()) {
                                 System.out.println(values);
                      }
           }
}
実行結果
田中
鈴木
山田

参考文献

【初心者向け】Javaのmapの使い方を解説!サンプルコードも紹介!
【Java入門】Mapの使い方総まとめ(HashMapで初期化、値のソート)

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

IntelliJでunitテストしようとしたときに"java.lang.OutOfMemoryError: Java heap space"といわれた

 起こったこと

スクリーンショット 2021-01-05 14.59.43.png
ある日intellijでjavaのunitテストをしようとしたところ。。。

java.lang.OutOfMemoryError:

というエラーが、、、
調べてみるとそこそこ情報はあったのですが、割とハマったので備忘録として対応方法を残しておきます。

やったこと

今回は2つの方法をやりました

1つめ

メニューバー > IntelliJ IED > Preferences > Compiler
Shared build process VM options:-Xmx2048mを追加
スクリーンショット 2021-01-05 15.05.28.png
このやり方が調べてて一番多く出てきた方法です

2つめ

スクリーンショット 2021-01-05 15.09.24.png
unit testの実行ボタンから一番下のModify Run Configurationを選択
スクリーンショット 2021-01-05 15.09.41.png
このような画面が出てくるのでここのVM optionsのところに-Xmx2048mを入れapplyする

まとめ

調べていると割と1つめのやり方で解決している方が多そうだったのですが、なぜか僕は2つめのやり方をしないと解決しなかったのでもし参考になる方がいらっしゃれば嬉しいです

参考文献

https://stackoverrun.com/ja/q/7802559
https://www.366service.com/jp/qa/986b19e266eaaafb99b2f2ccddd3378c

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

Android アプリ開発時の参考資料集

概要

とあることから、Google Maps APIを使用したAndroidアプリを作成することになったので、
参考にしたリンクを備忘録のために纏めました。

環境編

前提

Androidコードディング規約
もしあなたが急にAndroidアプリを業務で作るはめになった場合の選択肢(2021年初頭版)

Android Studio

Android studio の Gradleについて調べてみた
Android Studioでの外部ライブラリの読み込み方と注意点

ドキュメント

Javadocの作成方法を現役エンジニアが解説【初心者向け】

設計編

Android アプリ設計パターン入門

コーディング編

パーミッション

Androidパーミション別-何してんの?#5 NETWORK編
設定画面のインテントアクションまとめ

画面遷移

[Android] 10分で作る、Navigationによる画面遷移
最初のActivityに戻る
Fragmentによる画面遷移でハマった
Fragmentで、パラメータ付きの画面遷移を実装する

View要素

Button

[Android] Button のonClickListenerの設定が色々できる件

Fragment

Fragment自身を終了させる
AndroidStudioの標準デザインパターンで分かるFragment入門
AndroidでFragmentの結果をActivityで受け取る

HTTP通信

AndroidでHTTP通信したいときの手段まとめ

GPS関連

[Android] GPSで位置情報を取得するアプリを作る

Callback・マルチスレッド・タスク

プロセスとスレッドの概要

Handler

Handler と Looper
Handlerの使い方を紹介する
AndroidでTimerを使わずHandlerだけでお手軽に定期実行してあげる
Handlerクラスの正しい使い方(Androidでスレッド間通信)
幸せな非同期処理ライフを満喫するための基礎から応用まで
【Java】Handlerクラスについてまとめてみました
【Android】HanlderとMessageを使ってマルチスレッドの処理結果を受け取る

Task

【Java】定期的にタスクを実行する方法

スレッドセーフ

排他制御のあれこれ

ライフサイクル

onCreate と onStart と onResume の違い
知らずに作って大丈夫?Androidの基本的なライフサイクルイベント31選
Androidの画面設計や遷移に関して整理してみる

その他

プログレスバー

Androidでプログレスダイアログを使用して、処理を行う
【Android】ProgressDialogがDeprecatedになっている理由、正しく理解してます?

Maps API編

GoogleMapsAPI

Google Maps Platform ドキュメント
地図オブジェクト
AndroidのアプリにGoogle Mapを組み込む
Android - Polyline encoding algorithm?

まとめ

とりあえず、リンクを羅列しましたが、各リンクから何が得られるのか、余裕があり、気力が沸いたら書こうとおもいます。

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

Android アプリ開発した際の躓きポイントを纏めてみた

概要

とあることから、Google Maps APIを使用したAndroidアプリを作成することになったので、
参考にしたリンクを備忘録のために纏めました。

環境編

前提

Androidコードディング規約
もしあなたが急にAndroidアプリを業務で作るはめになった場合の選択肢(2021年初頭版)

Android Studio

Android studio の Gradleについて調べてみた
Android Studioでの外部ライブラリの読み込み方と注意点

ドキュメント

Javadocの作成方法を現役エンジニアが解説【初心者向け】

設計編

Android アプリ設計パターン入門

コーディング編

パーミッション

Androidパーミション別-何してんの?#5 NETWORK編
設定画面のインテントアクションまとめ

画面遷移

[Android] 10分で作る、Navigationによる画面遷移
最初のActivityに戻る
Fragmentによる画面遷移でハマった
Fragmentで、パラメータ付きの画面遷移を実装する

View要素

Button

[Android] Button のonClickListenerの設定が色々できる件

Fragment

Fragment自身を終了させる
AndroidStudioの標準デザインパターンで分かるFragment入門
AndroidでFragmentの結果をActivityで受け取る

HTTP通信

AndroidでHTTP通信したいときの手段まとめ

GPS関連

[Android] GPSで位置情報を取得するアプリを作る

Callback・マルチスレッド・タスク

プロセスとスレッドの概要

Handler

Handler と Looper
Handlerの使い方を紹介する
AndroidでTimerを使わずHandlerだけでお手軽に定期実行してあげる
Handlerクラスの正しい使い方(Androidでスレッド間通信)
幸せな非同期処理ライフを満喫するための基礎から応用まで
【Java】Handlerクラスについてまとめてみました
【Android】HanlderとMessageを使ってマルチスレッドの処理結果を受け取る

Task

【Java】定期的にタスクを実行する方法

スレッドセーフ

排他制御のあれこれ

ライフサイクル

onCreate と onStart と onResume の違い
知らずに作って大丈夫?Androidの基本的なライフサイクルイベント31選
Androidの画面設計や遷移に関して整理してみる

その他

プログレスバー

Androidでプログレスダイアログを使用して、処理を行う
【Android】ProgressDialogがDeprecatedになっている理由、正しく理解してます?

Maps API編

GoogleMapsAPI

Google Maps Platform ドキュメント
地図オブジェクト
AndroidのアプリにGoogle Mapを組み込む
Android - Polyline encoding algorithm?

まとめ

とりあえず、リンクを羅列しましたが、各リンクから何が得られるのか、余裕があり、気力が沸いたら書こうとおもいます。

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

【Eclipse】Version 1.8.0_261 of the JVM is not suitable for this product. Version: 11 or greater is required エラー

Pleiades All in One Javaをダウンロード
手順に従って、ファイルを解凍
pleiades/eclipse/eclipe.exeと進んだところ

Version 1.8.0_261 of the JVM is not suitable for this product. Version: 11 or greater is required

といったエラーが出て、eclipseを起動できませんでした

【解決策】

まずこちらの動画を参考にしました
https://www.youtube.com/watch?v=CgwpdheXvls

eclipse.iniファイル(画像の下から3番目、名前はeclipseとしか書いてないのでわかりづらい)を編集
スクリーンショット (6).png

-vm
Javaのバージョンを指定

のように書いてありましたが、Javaのファイルは、Pleiaes All in Oneであればインストールされていないので、バージョンが分かりません

そこで
pleiades/eclipse/readme/eclipse.ini

こちらのファイルにはすでに
-vm
Javaのバージョン情報

が載っていたので、この2行をコピーして、先ほどの
pleiades/eclipse/eclipse.ini
のファイルにペーストすれば解決しました。

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

【Android】 DB上に保存しているレコードをCSV形式(カンマ区切り)で保存する。

ご挨拶

かなり久々の投稿になります。少し雑談から。急ぎの方は横の目次からジャンプしてください。
2020年は今まで生きてきた中である意味衝撃的でエキセントリックな1年でした。
皆さんも環境の変化やコロナへの不安などで、心が落ち着かない毎日を過ごされたかと思います。

自分も働く環境など、いろんなものが今までからガラッと180度変わった1年でした。
まさか、BTSにハマるなんて思いもしなかったし。(この投稿を書きながら今も聞いています。)

そんな中でもこの投稿を(ひいてはQiitaを)見に来られた方は、何かしらのシステム(アプリ)を自分の手で作り出すことに夢中になっている方かとお見受けします。

自分が嫌になることが多いこの職業ですが、「自分はできる!」と信じて頑張って欲しいです。

自分が投稿しているものは深い技術のものではなく、素人程度の技術をシンプルに応用しているものが
多いです。
まだまだ勉強中の身ですが、アプリ開発をされている方の少しでもお役に立てれば幸いです。

今回の目的

DB上に保存しているレコードをCSV形式(カンマ区切り)で保存して、そのデータを取り込むまでの
一連の流れを実装したい。

色々方法を模索したが、SAF(StorageAccessFramework)を今回採用した。
というよりも、これからのバージョンはこの方法が主流になるらしい。(Android4.4以降)

→ Open files using storage access framework -developer.android-

使用する環境

  • AndroidStudio Ver 3.4.1
  • Android 10.0 (Q) API 29

Permisson(アクセス権限)

注意しないといけないのは、Android6.X(API 23)以降からPermission(アクセス権限許可)をユーザに通知しないといけないこと。
今回はストレージにアクセスするので、ストレージへのアクセス権限をユーザに許可してもらわないといけません。
ストレージにアクセス出来ないというのは致命的なので、この機能を実装する前にその部分を実装してください。
詳細は以下のサイトを参考にしてください。(時間が空けばこの部分も記事にします。)

権限の概要-developer.android-

エクスポート編

では「エクスポート」から。
下記は別アプリケーションで保存先を指定するためのクラス。

MainActivity.java
public void fileopen_for_SAF() {
  try {
        //ファイル名を作成。
        StringBuilder fileName = new StringBuilder();
        fileName.append(/* 好きな名前 */);
        fileName.append("_");
        fileName.append(getToday()); //ここで作成日時を取得。
        fileName.append(".csv");

        //「Intent.ACTION_CREATE_DOCUMENT」は、ファイルを選択するためのIntent。
        Intent it = new Intent(Intent.ACTION_CREATE_DOCUMENT);

        //ここで取得するファイルの種類を制限する。(今回はALLタイプ)
        it.setType("*/*");

        //ファイル名をセットして、Intentを起動。
        it.putExtra(Intent.EXTRA_TITLE, fileName.toString());

        /* 「CREATE_DOCUMENT_REQUEST」は、Private intで予め定義しておく。 */
        startActivityForResult(it, CREATE_DOCUMENT_REQUEST);

      } catch (Exception e) {
          e.printStackTrace();
      }

作成日付取得クラス。(Calendarクラスをインポートする必要あり。)
作成結果は「(好きな名前)_2021_01_0500_15.csv」みたいに作成されます。

MainActivity.java
private String getToday() {
   try {
       StringBuilder today = new StringBuilder();
       today.setLength(0);

       //日付の設定
       dd = Calendar.getInstance();
       today.append(dd.get(Calendar.YEAR));
       today.append("_");
       today.append(dd.get(Calendar.MONTH) + 1);
       today.append("_");
       today.append(dd.get(Calendar.DAY_OF_MONTH));
       today.append("_");
       today.append(dd.get(Calendar.HOUR));
       today.append("_");
       today.append(dd.get(Calendar.MINUTE));

       return today.toString();
   } catch (Exception e) {
       e.printStackTrace();
   }
   return null;
}

インテントの結果は、「onActivityResult」に返ってくる。
他にインテントの結果が返ってくるようなものがあった場合のことを考えて、requestCodeは、エクスポート用に変数を分けておく。

MainActivity.java
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

    /* 「CREATE_DOCUMENT_REQUEST」は、Privateで予め定義しておく。 */

    if (requestCode == CREATE_DOCUMENT_REQUEST) {
         //エクスポート
         if (resultCode == RESULT_OK) {
             Uri create_file = data.getData();  //取得した保存先のパスなど。

             //出力処理を実行。その際の引数に上記のUri変数をセットする。
             if (exportCsv_for_SAF(create_file)) {
                 //出力に成功した時の処理。
             } else {
                 //出力に失敗した時の処理。
             }
         } else if (resultCode == RESULT_FAILED) {
             //そもそもアクセスに失敗したなど、保存処理の前に失敗した時の処理。
         }
     }

     //リストの再読み込み
     this.LoadData();

     super.onActivityResult(requestCode, resultCode, data);
 }

実際に出力を行うクラス。
DB部分はご自分の環境に合わせて作成してください。

MainActivity.java
public Boolean exportCsv_for_SAF(Uri openFile) {

    try {
        OutputStream os = getContentResolver().openOutputStream(openFile);
        OutputStreamWriter os_write = new OutputStreamWriter(os, Charset.forName("Shift_JIS")); //後々インポートする際に困るのでエンコードを指定しておく。
        PrintWriter pw = new PrintWriter(os_write);

        StringBuilder rec = new StringBuilder(); //Export_data用

        //Read Data

        /* ここにExportするデータを取得するためのDBインスタンスなどを記述する。*/

        StringBuilder sql = new StringBuilder();
        sql.setLength(0);
        sql.append(/* 取得用のSQL */)

        c = db.rawQuery(sql.toString(), null);
        while (c.moveToNext()) {
            rec.setLength(0);

            rec.append(/* 取得カラムデータをExport用Builderにセット。 */);
           /* ↑をExportするカラム分呼び出す。*/

            pw.println(rec.toString()); //Export

        }

        //基本的に開けたら閉める。
        c.close();
        pw.close();
        os_write.close();
        os.close();

    } catch (SQLiteException e) {
        e.printStackTrace();
        return false;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } finally {
        if (db.isOpen()) {
            db.endTransaction();
        }
    }
    return true;
}

とりあえずここまで。

インポート編

  • 制作中

終わりに

ここまでお疲れ様でした。というより疲れた。
データのインポート/エクスポートをするという目的なだけで色々調べる事になったので、勉強になりました。
一番シンプルに実装するとこの記事のようにできますので、ご自分で工夫してぜひお試しください。
他にも「アプリケーションが独自のストレージを提供すること」などができるみたいなので、時間がある時に試してみます。

P.S.
インポート編は時間がある時に追記します。

参考サイト

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