20190811のJavaに関する記事は17件です。

[Java]RecyclerViewの使用方法とアニメーション付きスワイプ処理の実装をメモ。

1. はじめに

1.1 お断り

このサイトではQiita内の投稿をいくつかリンクさせていただいております。不愉快だと感じた投稿者様はコメントしていただければ幸いです。対応させていただきます。

1.2 目的

RecyclerViewはとても便利です。僕はListViewの代わりに使っているのですがその実装方法とスワイプの実装を忘れてしまうのでここにメモをします。スワイプのアニメーションはGmailのメール削除のスワイプをまねます。

2. RecyclerView本体

この実装内容は「RecyclerViewの基本」by@naoi様と同じです。とても分かりやすく解説されています。RecyclerViewの仕組みは少し複雑なので図も覚えとくといいと思いますよ。

ここでは以下の四つを制作します。
- adapter_row.xml
- DataModel.java
- ViewHolder.java
- Adapter.java

今回、入れるデータは画像と文字列にしましょう。

2.1 一列のレイアウトを決める (adapter_row.xml)

RecyclerViewの一列のレイアウトを決めます。

adapter_row
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/imageView_adapter_show_bitmap"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView_adapter_show_string"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</android.support.constraint.ConstraintLayout>

2.2 構造体を作る (DataModel.java)

Javaに構造体はありませんが、Classで代用できますよね。

DataModel.java
public class DataModel {
    private Bitmap mBitmap;
    private String mString;

    public Bitmap getBitmap () {
        return mBitmap;
    }

    public String getString () {
        return mString;
    }

    public void setBitmap (Bitmap mBitmap) {
        this.mBitmap = mBitmap;
    }

    public void setString (String mString) {
        this.mString = mString;
    }
}

メンバ変数にmを付ける習慣って一般的にはないんですかね...

余談ですが「get~」とか「set~」っていうのはgetter/setterていうらしいですが、AndroidStudioで、publicまで打つとメンバ変数のgetter/setterを作ってくれるそう。ちょっと名前変えたらそれで完成だからありがたい。

2.3 一行内のViewを取得 (ViewHolder.java)

ViewHolderを作ります。ここでxml本体は指定しませんが一行のなかのViewfindViewByID()します。

ViewHolder.java
public class ViewHolder extends RecyclerView.ViewHolder {
    public ImageView mImageView;
    public TextView mTextView;

    // コンストラクタ
    public ViewHolder (@NonNull View itemView) {
        super(itemView);
        mImageView = itemView.findViewById(R.id.imageView_adapter_show_bitmap);
        mTextView = itemView.findViewById(R.id.textView_adapter_show_string);
    }
}

コンストラクタはRecyclerView.ViewHolderを継承すると引数にitemViewを追加するように要求されます。

2.4 データを配置する (Adapter.java)

Adapter.java
public class Adapter extends RecyclerView.Adapter<ViewHolder> {

    private List<DataModel> insertDataList;

    public Adapter (List<DataModel> list) {
        this.insertDataList = list;
    }

    @NonNull
    @Override
    public NoteViewHolder onCreateViewHolder (@NonNull ViewGroup viewGroup, int i) {
        View inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.adapter_row, viewGroup, false);
        return new ViewHolder(inflate);
    }

    @Override
    public void onBindViewHolder (@NonNull ViewHolder viewHolder, int i) {
        noteViewHolder.mImageView.setImageBitmap(insertDataList.get(i).getBitmap());
        noteViewHolder.mTextView.setText(insertDataList.get(i).getString());
    }

    @Override
    public int getItemCount () {
        return insertDataList.size();
    }
}

3.使い方

Activity等での使い方は以下の通りです。
Adapterは他のと競合してしまうかも...(僕は実際、違う名前を付けている。)

MainActivity.java
public class RegisterNoteActivity extends AppCompatActivity {
    RecyclerView mRecyclerViewList;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerViewList = findViewById(R.id.recyclerView_main);

        LinearLayoutManager manager = new LinearLayoutManager(this);
        mRecyclerViewList.setHasFixedSize(false);
        mRecyclerViewList.setLayoutManager(manager);
        mRecyclerViewList.setAdapter(new Adapter(createData()));
    }

    private List<NoteDataModel> createData() {
        List<NoteDataModel> list = new ArrayList<>();
        for (int index = 0; index < 100; index++) {
            // 一行分のデータ
            NoteDataModel rowData = new NoteDataModel();
            rowData.setBitmap(/*なんかの画像*/);
            rowData.setmString("この行は" + (index + 1) + "回目の繰り返しです。");
            list.add(rowData);
        }
        return list;
    }
}

4. スワイプ

アニメーション付きスワイプを実装しましょう。
実をいうともともとスワイプを実装すると横にずれたり、シュッって消えたりするアニメーションはついてきます。色とアイコンはついてこないのでここを実装すればいいということです。
今回は左スワイプの時のみ削除にします。色は赤でアイコンは自前のゴミ箱マークです。

MainActivity.java
    // ...省略    
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register_note);
        // ...省略...
        mRecyclerViewList.setAdapter(new Adapter(createData())); // さっきの
        // ここから追加
        final Drawable deleteIcon = ContextCompat.getDrawable(this, R.drawable.ic_action_delete);
        ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {

            @Override
            public boolean onMove (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
                return false;
            }

            @Override
            public void onSwiped (@NonNull RecyclerView.ViewHolder viewHolder, int i) {
                int swipedPosition = viewHolder.getAdapterPosition();
                Adapter adapter = (Adapter) mRecyclerView.getAdapter();
                // 登録とかするんだったらなにかのリストから削除をする処理はここ
                // 削除されたことを知らせて反映させる。
                adapter.notifyItemRemoved(swipedPosition);
            }

            @Override
            public void onChildDraw (@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
                View itemView = viewHolder.itemView;

                // キャンセルされた時
                if (dX == 0f && !isCurrentlyActive) {
                    clearCanvas(c, itemView.getRight() + (int) dX, itemView.getTop(), itemView.getRight(), itemView.getBottom());
                    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, false);
                    return;
                }

                ColorDrawable background = new ColorDrawable();
                background .setColor(Color.parseColor("#f44336"));
                background.setBounds(itemView.getRight() + (int)dX, itemView.getTop(),  itemView.getRight(), itemView.getBottom());
                background.draw(c);

                int deleteIconTop = itemView.getTop() + (itemView.getHeight() - deleteIcon.getIntrinsicHeight()) / 2;
                int deleteIconMargin = (itemView.getHeight() - deleteIcon.getIntrinsicHeight()) / 2;
                int deleteIconLeft = itemView.getRight() - deleteIconMargin - deleteIcon.getIntrinsicWidth();
                int deleteIconRight = itemView.getRight() - deleteIconMargin;
                int deleteIconBottom = deleteIconTop +  deleteIcon.getIntrinsicHeight();

                deleteIcon.setBounds(deleteIconLeft, deleteIconTop, deleteIconRight, deleteIconBottom);
                deleteIcon.draw(c);
            }
        };
        new ItemTouchHelper(callback).attachToRecyclerView(mRecyclerView);

    }

    private void clearCanvas(Canvas c, int left, int top, int right, int bottom) {
        Paint paint = new Paint();
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        c.drawRect(left, top, right, bottom, paint);
    }
    // 省略...

アイコンの画像や計算、色コード、処理思想は「Android のリストをスワイプして削除する #あれどうやるの?」by@shts様とそのGithubからいただきました。無断ですみません。

スワイプが完了したときに発火するのはonSwipedですが、それに対してキャンセルしたとしても途中に毎フレームごとに呼ばれるのがonChildDrawです。onMoveはドラッグアンドドロップも許可したとき用だそうですがfalseを返しとけばいいのかな?

追記ですが右スワイプと左スワイプ両方を許可するのは以下の通りにやればいいみたいです。

        ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

            @Override
            public boolean onMove (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
                return false;
            }

            @Override
            public void onSwiped (@NonNull RecyclerView.ViewHolder viewHolder, int i) {

            }

            @Override
            public void onChildDraw (@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
                if (dX < 0) {
                    // 左スワイプのとき
                } else {
                    // 右スワイプのとき
                }
            }
        };

隠れてぱっと見では見えないけど、一行目の最後、ItemTouchHelper.LEFT | ItemTouchHelper.RIGHTになってるので気を付けてください。
onChildDrawは上記通りなのですが、onSwipedでの処理の分け方はわからないです。(iを使うのかな?)

5.まとめ

まずは参考にさせていただいたサイトの投稿者様誠にありがとうございました。少し雑ではありますがこちらでまとめて紹介させていただきます。

RecyclerViewの基本
RecyclerView本体についてほぼ同じようにまねさせていただたきました。

RecyclerViewでドラッグアンドドロップの移動とスワイプの削除
スワイプのイメージをつかみました。

Android のリストをスワイプして削除する #あれどうやるの?
スワイプの処理についてJavaに書き直させていただきました。
→画像と詳しい処理は付属のGitHubからです。

Android で RecyclerView を使って横スワイプで要素を削除する方法のメモ
JavaでAdapterをどうやて更新するかを参考にしました。

RecyclerViewのアイテムをスワイプで削除する方法
投稿外での追加の処理について参考にしました。

皆さんありがとうございました。
こうまでして他人のコードを取りまくっていくことでしか処理を生み出せない自分が情けないですが、だからこそだれかのためになれればなと思います。

Twitter: https://twitter.com/Cyber_Hacnosuke (フォローしてくださいお願いします。)
いいねもお願いします。

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

registerTorchCallbackのAPIバージョンmin23設定でハマった

registerTorchCallback を使用した際にハマったことのメモ

APIレベル23(Android6)以降のみで使用できるメソッド。

自分はもともとAndroid5.1まで対応可能なプロジェクトを作成していた(APIレベル22)ため、「使おうとしてるメソッドやと、おたくが設定したAPIレベルじゃ対応でけん端末があるで。ええ具合に修正してや。直さんかったらビルドさせん」エラーが発生。

改めて読んでみると、「AndroidManifestファイルに対応させたい最低限のAPIレベルを書き込むか、build.gradle(モジュール:app)に書き込めや」とのこと。

まず、manifestファイルに以下記述。

AndroidManifest.xml
<uses-sdk minSdkVersion="23" />

実行してもエラーが直らない。改めてエラーが発生「manifestファイルにminSdkVersionは書かんといてや。 結局gradleファイルから上書きするし」

最初からそう言えや!ということで、build.gradle(モジュール:app)内を確認すると以下記述を発見。こいつがやんちゃしてたか。

build.gradle(module_app)
android{
...
  defaultConfig{
      minSdkVersion 22//←23に修正
...
  }
}

修正後、manifestファイルからは当該項目を削除するとエラーが消えた。
ただし、Android6以前には対応でけん。まあ個人用やしええで。

https://developer.android.com/reference/android/hardware/camera2/CameraManager.TorchCallback.html

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

配列の練習2

ArrayPracticeクラスのフィールド部分で
int[][]arr= new int[3][students];と入れたかったが
エラーが出たので諦め。できるだけ読みやすくなるよう努めた。
メソッドの内容は前の配列練習の文を元に少し手を加えた。

ArrayExam.java
package JavaStudy;
//メソッドを分けて配列の練習
//テスト結果(教科名・平均点・科目別最高点・生徒数)を出力

public class ArrayExam {

    public static void main(String[] args) {
        final int math = 0;
        final int english = 1;
        final int science = 2;

        ArrayPractice t = new ArrayPractice(20);
        t.startExam(math);
        t.startExam(english);
        t.startExam(science);

        t.printResult(math);
        t.printResult(english);
        t.printResult(science);
    }
}
ArrayPractice.java
package JavaStudy;
import java.util.Random;
//各項目出力用のメソッドをまとめた
public class ArrayPractice {
    final String[] SUBJECT= {"算数","英語","理科"};
    int students = 0;
    int [][] arr;
    //インスタンス生成時にクラスの生徒数を受け取る
    ArrayPractice(int students){
        this.students = students;
        arr = new int[3][students];
    }

    void printResult(int sub) {
        //結果を出力する
        System.out.println("試験科目は "+ SUBJECT[sub]+"です。");
        System.out.println("生徒数は "+ students +"人です。");
        System.out.println("平均点は "+ resultAverage(sub)+"点です。");
        System.out.println("最高点は "+ getMax(sub)+"点です。");        
        System.out.println("-----------");
    }
    int getMax(int sub) {
        //科目別の最高点を返す
        int max = 0;
        for(int i = 0;i < students;i++) {
            if(arr[sub][i] > max) 
                max = arr[sub][i];
        }
        return max;
    }
    void startExam(int sub) {
        //ランダムな点数(0〜100点)を教科の配列にいれる
        Random random = new Random();
        for(int i = 0;i < students ;i++) 
            arr[sub][i] = random.nextInt(101);      
    }
    int resultAverage(int sub) {
        //平均点を返す
        int sum = 0;
        int average = 0;
        for(int i =0;i < students;i++) 
            sum = sum + arr[sub][i];
        average = sum/students;
        return average;
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpneJDK8 ビルド on CentOS7_x86_64

OpenJDK8 をソースコードからビルド

参考:http://hg.openjdk.java.net/jdk/jdk/file/tip/doc/building.md

必要パッケージ導入

"開発者ツール"をグループインストール
(*) OSインストール時に"開発者ツール"にチェックをいれた場合は作業不要

# yum groupinstall -y "Development Tools"

openjdkビルドに必要な依存パッケージ導入
ブートストラップJDKは以前のメジャーリリースのJDKを使用する(OpenJDK7)
(参考)http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html#setup

# yum install -y java-1.7.0-openjdk-devel
# yum install -y libXtst-devel libXrender-devel cups-devel freetype-devel alsa-lib-devel libXt-devel fontconfig-devel

ソースコードDL

バージョン管理ツール Mercurial インストール

# yum install -y hg

ビルド用のホームディレクトリを /usr/local/src/openjdk8 とする場合

# cd /usr/local/src
# hg clone http://hg.openjdk.java.net/jdk8u/jdk8u openjdk8u
# cd openjdk8u
# chmod +x get_source.sh
# ./get_source.sh

configureスクリプト実行

# cd /usr/local/src/openjdk8u
# chmod +x configure
# ./configure

makeスクリプト実行

# cd /usr/local/src/openjdk8u
# make images

ビルドされたJDKの検証

build/linux-x86_64-normal-server-release/images/j2sdk-image 配下にビルド成果物が生成される(JREは j2jre-image 配下)
生成された新たなjavaコマンドバイナリでバージョン確認して検証する

# cd /usr/local/src/openjdk8u
# cd ./build/linux-x86_64-normal-server-release/images/j2sdk-image
# ./bin/java -version
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dateクラスのbefore,afterの結果を数直線で表現してみた

Dateクラスのbefore、afterの結果が、文章だと微妙にわかりにくかったので、
数直線で表現してみました。

以下、base、arg共にDate型とします。

base.before(arg)

before1.png
after1.png

base.after(arg)

before2.png
after2.png

結果:わかりやすくなった!

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

【Java】Mapの使い方

初期化

Mapは型にプリミティブを指定できないので、IntegerやStringのようなラッパークラスを指定すること

Map<Integer, String> map1 = new HashMap<Integer, String>(); 

要素の追加

オブジェクト名.put(キー, "値")

map1.put(1, "apple"); 
map1.put(2, "orange");
map1.put(3, "cherry"); 

要素の取得

オブジェクト名.get(キー)

map1.get(1); 
map1.get(2); 
map1.get(3);

System.out.println(map1.get(1));
//出力結果は"cherry"になる

※キーが重複した場合

map1.put(1, "apple"); 
map1.put(2, "orange");
map1.put(1, "cherry"); 

System.out.println(map1.get(1));
//出力結果は"cherry"になる

Map内の要素はキーで値を管理しているため重複はできない。
putで重複したキーに値を入れた時点で以前のものと置き換えられてしまう。

要素の削除

一つ削除する場合
オブジェクト名.remove(キー)

map1.put(1, "apple"); 
map1.put(2, "orange");
map1.put(3, "cherry"); 

map1.remove(1);

System.out.println(map1);
//出力結果は{2=orange, 3=cherry}となる

全削除する場合
オブジェクト名.clear()

map1.put(1, "apple"); 
map1.put(2, "orange");
map1.put(3, "cherry"); 

map1.clear();

System.out.println(map1);
//出力結果は{}になる

要素の置き換え

map1.put(1, "apple"); 
map1.put(2, "orange");
map1.put(3, "cherry"); 

map1.replace(2, "banana");

System.out.println(map1.get(2));
//出力結果はbananaになる

キーの取得

mapに存在するキーを返す
オブジェクト名.keySet()

map1.put(1, "apple"); 
map1.put(2, "orange");
map1.put(3, "cherry"); 

System.out.println(map1.size());
//出力結果は[1, 2, 3]になる

キーの個数を取得

mapに存在するキーの個数を返す
オブジェクト名.keySet()

map1.put(1, "apple"); 
map1.put(2, "orange");
map1.put(3, "cherry"); 


System.out.println(map1.size());
//出力結果は3になる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】CollectionクラスのComparator

Comparator…コレクションで全体順序付けを行う比較関数

Listの要素を昇順に並び替えたい

        public static void main(String[] args) {
            List<String> list = Arrays.asList("apple","melon","banana","cherry","orange");
            Collections.sort(list, Comparator.naturalOrder());
            System.out.println(list);
          }

Listの要素を降順に並び替えたい

        public static void main(String[] args) {
            List<String> list = Arrays.asList("apple","melon","banana","cherry","orange");
            Collections.sort(list, Comparator.reverseOrder());
            System.out.println(list);
          }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】Listの要素を削除する

要素を一つ削除する

◆要素の値を指定する場合

    public static void main(String[] args) {

        String arr[] = {"orange","apple","cherry","melon","grape"};

        List<String> list = new ArrayList<>(Arrays.asList(arr));
        list.remove("apple");
    }

◆要素のINDEX番号を指定する場合

    public static void main(String[] args) {

        String arr[] = {"orange","apple","cherry","melon","grape"};

        List<String> list = new ArrayList<>(Arrays.asList(arr));
        list.remove(1);
    }

要素を複数削除する

削除したい要素を持つlistを生成し、list.removeAll()メソッドの引数に入れる

    public static void main(String[] args) {

        String arr[] = {"orange","apple","cherry","melon","grape"};

        List<String> list = new ArrayList<>(Arrays.asList(arr));

        List<String> remove = new ArrayList<>();
        Collections.addAll(remove,"apple","melon");

        list.removeAll(remove);

        System.out.println(list);
    }

要素をすべて削除する

全削除なのでlist.sizeは0になる

    public static void main(String[] args) {

        String arr[] = {"orange","apple","cherry","melon","grape"};

        List<String> list = new ArrayList<>(Arrays.asList(arr));

        list.clear();

        System.out.println(list.size());
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SpringBoot】スコープ外でAutowireされる内容をMock化する【JUnit5】

背景

@Autowiredを用いるようなCustomValidatorが絡む内容をテストするため、BeanMock化します。

やり方

実装は以下の通りです、解説はそれぞれコメントを参照してください。

// この2つを付ければ@RunWith(MockitoJUnitRunner.class)やrule類のアレコレは不要
@ExtendWith(SpringExtension.class)
@SpringBootTest
class HogeTest {
    // BeanをMock化、このインスタンスがinjectされる
    @MockBean FugaDao fugaDao;

    @Test
    @DisplayName("Daoから取得できなかった場合")
    void isEmpty() {
        // mockに対する設定方法は通常のMockitoを用いる時と同じ
        when(fugaDao.selectFuga(anyInt())).thenReturn(Optional.empty());

        /* 実際のバリデーションについては省略 */

    }
}

補足

以下このやり方に関する補足です。

1

コンストラクタに入力できるなど、自分でインスタンス内容に関与可能な内容については、余程の事情が無ければ直接Mock化してテストした方がいいです。

2

本来具体的なクラスのテストがCustomValidatorの実装に左右されるのはおかしいため、CustomValidatorMock化する方がよいです。
これについては、調べた限りだとざっくり以下のやり方を見つけました。

  • リフレクションを用い、CustomValidatorMockに差し替える
  • JMockitoPower Mockを用い、「そのクラスのインスタンス全てをMock化する」ようにする

この記事では諸事情によりどちらの方法も用いないこととしたため、BeanMock化する方法でテストを行っています。

関連記事

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

【Java】特定のオブジェクトが含まれているかを判定するListメソッド

list.contains()

特定の要素があるかを判定し、booleanで返す

    public static void main(String[] args) {

        String arr[] = {"orange","apple","cherry","melon","grape"};

        List<String> list = new ArrayList<>(Arrays.asList(arr));

    if(list.contains("banana")) {
            System.out.println("存在する");
        }else {
            System.out.println("存在しない");
        }
    }

list.indexOf()

特定の要素のINDEX番号をintで返し、存在しない場合は-1を返す

    public static void main(String[] args) {

        String arr[] = {"orange","apple","cherry","melon","grape"};

        List<String> list = new ArrayList<>(Arrays.asList(arr));

        int x = list.indexOf("orange");
        System.out.println(x); 

        if(list.indexOf("orange") != -1) {
            System.out.println("存在する");
        }else {
            System.out.println("存在しない");
        }

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

【Java】配列からListへの変換

配列からListへ変換をしたい

public static void main(String[] args) {

    String arr[] = {"orange","apple","cherry","melon","grape"};
    List<String> list = Arrays.asList(arr);

arrを引数にしたArrays.asListをlistに代入

要素数を追加したい場合

NG例

    List<String> list = Arrays.asList(arr);
    list.add("banana");

(原因)Arrays.asList()は追加や削除といったListのメソッドの操作を受け付けない

OK例

    List<String> list = Arrays.asList(arr);
    List<String> list2 = new ArrayList<>(list);
    list2.add("banana");

listをArrayListの引数にしてlist2に代入
上記を簡潔に書くと

    List<String> list = new ArrayList<>(Arrays.asList(arr));
    list.add("banana");
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java / Swift]Java Interface と Swift Protocol の比較

この記事で書くこと

Java interface と Swift Protocol の比較

この記事を書いた理由

・ 基本情技術者試験対策
・ Java と Swift で似ている箇所の比較

コード例(Java interface)

main.java
public class Main {

    interface sampleInterface{
        String sampleFunction(String a, String b);
    }


    public static void main(String[] args) throws Exception {

    /* クラスに interface を実装する時は、implements と書く */    
    class A implements sampleInterface{
        public String sampleFunction(String a, String b){
            return "「" + a + "」と「" + b + "」はclassAに定義されたsampleFunctionの引数";
        }
    }

    class B implements sampleInterface{
        public String sampleFunction(String a, String b){
            return "「" + a + "」と「" + b + "」はclassBに定義されたsampleFunctionの引数";
        }
    }

    A a = new A();
    B b = new B();

    System.out.println(a.sampleFunction("c","d"));
    System.out.println(b.sampleFunction("e","f"));

    }
}

出力結果(Java)

「c」と「d」はclassAに定義されたsampleFunctionの引数
「e」と「f」はclassBに定義されたsampleFunctionの引数

コード例(Swift Protocol)

sample.swift
// プロトコル
protocol SampleProtocol{
    func sampleFunction(_ a:String, _ b:String) -> String
}

// class A
class A:SampleProtocol{
    func sampleFunction(_ a:String, _ b:String) -> String{
        return "「\(a)」と「\(b)」はclassAに定義されたsampleFunctionの引数"
    }
}


// class B
class B:SampleProtocol{
    func sampleFunction(_ a:String, _ b:String) -> String{
        return "「\(a)」と「\(b)」はclassBに定義されたsampleFunctionの引数"
    }
}


var a = A()
var b = B()

print(a.sampleFunction("c","d"))
print(b.sampleFunction("e","f"))

出力結果(swift)

「c」と「d」はclassAに定義されたsampleFunctionの引数
「e」と「f」はclassBに定義されたsampleFunctionの引数
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java]ArrayList HashMap

この記事で書くこと

JavaのArrayListおよびHashMapの書き方

書いた理由

基本情報技術者試験対策

コード例

main.java
import java.util.ArrayList;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) throws Exception {
        // ArrayList
        ArrayList<String> strList = new ArrayList<String>();
        strList.add("sample1");
        strList.add("sample2");
        System.out.println(strList);

        strList.remove(1);
        System.out.println(strList);

        // HashMap
        HashMap<String,String> map = new HashMap<String,String>();
        map.put("key1","value1");
        map.put("key2","value2");
        System.out.println(map);
        System.out.println(map.get("key1"));
        System.out.println(map.remove("key2"));
        System.out.println(map);

    }
}

実行結果

[sample1, sample2]
[sample1]
{key1=value1, key2=value2}
value1
value2
{key1=value1}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Programming News】Qiitaまとめ記事 Weekly August 2nd week, 2019 Vol.4

筆者が2019/8/4(日)~8/10(土)に気になったQiitaの記事のまとめのまとめを作成しました。日々のまとめ記事のWeekly版です。

皆様が興味のある言語や思いもよらぬハック方法をこの中から見つけられたら幸いです。

Java

Python

Ruby

Rails

C#

Android

Swift

Kotlin

Flutter

Fulx

JavaScript

React

Node.js

Vue.js

Vuex

Nuxt.js

Nest.js

Angular

jQuery

TypeScript

C#

PowerApps

ReactNative

Laravel

C

PHP

CakePHP

Rust

Go言語

R言語

Scala

Haskell

Unity

Spark

Twitter

Line

A-Frame

PowerApp

Line

HTML

CSS

Sass

SQL

MySQL

PostgreSQL

Oracle

MongoDB

SQL Server

Apache

ビッグデータ

Visual Studio Code

IntelliJ IDEA

AI

IoC

Git

AWS

Azure

Oracle Cloud

IBM Cloud

Active Directory

Cloud SQL

Cloud9

インフラ

ブロックチェーン

Ethereum

Hyperledger

セキュリティ

機械学習

自然言語処理

Network

RPA

CI

Docker

Heroku

VirtualBox

kubernetes

OpenStack

Swagger

AMP

OpenID

OAuth2.0

Elasticsearch

Linux

Cent OS

Windows

Mac

Redis

Google API

Google Apps Script

Google Cloud Platform

Google Colaboratory

Google Cloud Data Catalog

Google Drive

VB.Net

Firebase

Server Side

CSS

BootStrap

WordPress

Develop

Keras

PowerShell

Vim

Atom

awk

LaTex

Redmine

UML

Raspberry

RPA

IoT

Alexa

Line

SharePoint

VBA

ShellScript

PowerShell

Slack

Nim

Emacs

WPF

UI

Ansible

Arduino

Julia

Coral

ionic

QRCode

OCR

EC-CUBE

資格

転職

更新情報

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

3の倍数の出力

8/11追記 
・3/0はエラー(ArithmeticException)になるけど、0/3はエラーでない

基本ルール:3の倍数は"!!"がつく
1. 入力された数値を1から順に出力
2. 1を逆に出力
3. ランダムな数値を15個出力

Nabeatsu.java
import java.util.Random;
import java.util.Scanner;

public class Nabeatsu {

    public static void main(String[] args) {
        //3の倍数だけアホになる
        Scanner scan = new Scanner(System.in);
        int number = scan.nextInt();
        for(int i = 1;i <= number; i++) {
            if(i % 3 == 0) 
                System.out.println(i + "!!");   
            else
                System.out.println(i);
        }
        for(int i = number;i > 0; i--) {  //逆順に
            if(i % 3 == 0) 
                System.out.println(i + "!!");   
            else
                System.out.println(i);
        }

        Random random = new Random();
        int i = 0;
        while(i<15) {
            int ran = random.nextInt(500);
            if(ran % 3 == 0) {
                System.out.println(ran+ "!!");  
                i++;
            }else {
                System.out.println(ran);
                i++;

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

3の倍数の出力とエラーの練習

基本ルール:3の倍数は"!!"がつく
1. 入力された数値を1から順に出力
2. 1を逆に出力
3. ランダムな数値を15個出力

Nabeatsu.java
import java.util.Random;
import java.util.Scanner;

public class Nabeatsu {

    public static void main(String[] args) {
        //3の倍数だけアホになる
        Scanner scan = new Scanner(System.in);
        int number = scan.nextInt();
            for(int i = 1;i <= number; i++) {
                if(i % 3 == 0) 
                    System.out.println(i + "!!");   
                else
                    System.out.println(i);
            }
            for(int i = number;i > 0; i--) {  //逆順に
                if(i % 3 == 0) 
                    System.out.println(i + "!!");   
                else
                    System.out.println(i);
            }

        Random random = new Random();
        int i = 0;
            while(i<15) {
                int ran = random.nextInt(500);
                try{
                    if(ran % 3 == 0) {
                        System.out.println(ran+ "!!");  
                        i++;
                    }else {
                        System.out.println(ran);
                        i++;
                    }
                }catch(Exception e) {
                    //機能しない・・・なぜ? ran/3ではないから?
                    System.out.println("エラー ランダムに選ばれた数が0のため"); 
                    System.out.println(e);
                }
            }
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さらばEclipse, Visual Studio Codeでそこそこ軽量JavaFX開発 ~環境構築編~

対象読者(現状の私の状況)

要求

  • JavaFXでGUI開発をしようとしている。
  • ライトな開発環境がほしい or 宗教上の理由によりEclipseが使えない。
  • お布施が払えないのでIntelliJは使えない。
  • JDKの導入くらいは自分でできる
  • Javaの構文と動きがざっくり分かる
    => 最近Visual Studio CodeのJava開発がアツいらしいので試してみた。
    ※なお、初学者目線での実用性なので至らない点があればご指摘ください。

開発環境

  • Windows 10 + Visual Studio Code(1.37.0 執筆時最新)
  • OpenJDK 11.0.3 + OpenJFX 11.0.2
  • Visual Studio CodeのJava開発用拡張機能導入済み。
    Visual Studio CodeへのJava開発環境構築とIntelliSense等を含めた拡張機能の導入方法は他の記事に譲ります(丸投げ)。

余談

最近、Java開発用のVisual Studio Codeインストーラーが出ましたが、今回はこれを試していません(Javaの実行環境自体はこれ以前に作っていたため)。どうもJDKがOpenJDKではなくAdoptOpenJDKらしいですね。

事前準備

JavaFXを公式サイトからダウンロードします。
執筆時点ではJDK 12向けとLTSであるJDK 11向けのバージョンが公開されています。
SDKがついている方で、一通りまずは動作させることができるので、SDKの方を導入します。
DL先はこちら
image.png

次に、DLしたファイルを任意の場所に展開しておきます。
今回はC:\Users\myuser\Documents\jfx\に展開したファイルを入れました。

設定方法

  1. JavaHomeをVisual Studio Codeのsettings.jsonに追加
    各自の環境に合わせて追加してください。すでに環境構築済みの場合は追加されているかもしれません。(IntelliSense自体はJavaHomeの設定がなくても動いてしまうため今回はここから設定)
    image.png

  2. デバッグ構成を追加
    Visual Studio Codeのデバッグ設定を追加します。
    image.png
    サイドバーの虫のマーク(バージョンによりアイコンは変動)をクリックし歯車のマークをクリックすると、launch.jsonがエディターで起動するのでここに追記を行います。

image.png

ここに追記を行います。
image.png


"vmArgs": "--module-path C:\\Users\\myuser\\Documents\\jfx\\javafx-sdk-11.0.2\\lib --add-modules javafx.controls,javafx.fxml"

のように、先程展開したJavaFXのlibディレクトリへのPATHと利用するモジュール名を追記します。

これにより、Visual Studio CodeからF5キーでデバッグモードを利用し実行結果を確認できるようになります。
image.png

まとめ

ノートパソコンのCPUでEclipseを動かすのは少し厳しいときなど、この方法が役に立つと思います。ただし、Javaの拡張機能自体がそこそこに重いので、Eclipseよりも少しはマシ、位に思うと心理的にも楽です。

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