20200222のJavaに関する記事は7件です。

javaでAtCoder Beginner Contest 156を解く

AtCoder Beginner Contest 156お疲れ様でした!
公式ページ

今回の自分の書いたコードはこちら
結果はA-DまでAC、Eはコンテスト終了後5分でACできました。悔しい:cry:

以下簡単に解説します。

問題A

引数にNとKが与えられ、
Kが10以下の場合にはNに100*(10-K)を足し算する問題。

100点問題っていう感じの難易度だったかと思います。

問題B

とある数字がK進法だと何桁かを出力する問題。
while文でぐるぐるまわして桁数をカウントしていけば大丈夫です。

while (n >= k) {
    n = n / k;
    digit++;
}

問題C

数直線上にN人の人がいて、その全員の移動距離の二乗和を最小にする点と二乗和を求める問題。
まずN人の人の中心となる座標を選定して(整数じゃないといけないのが注意)
あとは単純に二乗和を足し算しました。

N<=100となっていたので、計算量はあんまり気にしなくて大丈夫そうでした。

問題D

二項係数的な問題。以下の性質を使用します。

2^n = {}_n C _0 + {}_n C _1 + {}_n C _2 + ・・・\\
    = \sum_{k=0}^n {}_n C _k\\

すると、計算すべきは、

2^n - {}_n C _0 - {}_n C _a - {}_n C _b

となります。

問題E

法則を見つけられたのが終了10分前とかで、実装が間に合いませんでした、、
もともとN個の部屋に1人ずつ入っていて、1回移動が起こると、どこかの部屋が0になることに気づきました。

K個の部屋が0人の場合の組み合わせを計算してみました。すると、

{}_n C _k \times {}_{n-1} C _{n-1-k}

となります。具体的に言うと、n=6,k=2の場合は、

{}_6 C _2 \times {}_5 C _3

です。なので、この和をとって、

\sum_{i=0}^k \left( {}_n C _k \times {}_{n-1} C _{n-1-k} \right)

です。k=1のときとkが大きいときはまた別途考慮が必要でしたが、基本は以上で計算できました。
逆元を最初に計算して計算量の部分はうまく書けたのに、あとちょっとでした。

問題F

手つかずです。なんか入力も多くて難しい気がしたのでスルーしました。笑


レーティングは944→974。

全体的に少し難しかったように思えます。
E問題があともう少し・・・で手が届かず。でも、もう少しでE問題に手が届きそうだったので成長の実感は得られました!
次こそはE問題ACしたい・・・!

あと、TeX使って数式書いてみました。やっぱり美しいですね:chart_with_upwards_trend:

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

Struts2 を手動でwarファイルにしてデプロイするには

#目的
eclipseなしでStruts2をtomcatに配備する方法を知る。
前提:クラスファイルはコンパイル済み

フォルダ構成

スクリーンショット 2020-02-22 22.54.19.png

Struts2Calcというプロジェクトがあったとして、
トップページがindex.jsp
controllerパッケージにCalcAction.class
beanパッケージにCalcFormBean.class

というのがあるとすると上図のようになる。

classファイルがbinとかにある場合はこのようにclassesフォルダを作って移動させておく。
struts.xmlなどもclassesフォルダ直下になる。

warにする

terminal
cd ~/JavaProjects/Struts2Calc
jar cvf Struts2Calc.war -C WebContent .

で、warファイルができるので
これをtomcat/webapps/
に配置するとデプロイできる。

実はwarにする必要はない

どこをみてもtomcatにデプロイするにはwarを作ってwebappsフォルダに入れるように書いていますが、
試しに上のフォルダ構成でwarにせずにそのままwebappsに持っていっても動きました。
warファイルの正体はzipファイルで、tomcatは単にそれを普通に解凍しているだけのようです。
とはいえwarにするのが常識なので普通はそうしたほうがいいです。

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

eclipseを使わずにTomcatのローカルサーバを立ち上げるには

目的

・ちょっとしたJavaの学習用に軽量な環境を構築する。
・Tomcatの仕組みを深く理解する。
普段はeclipseからサーバを起動ボタン(トム猫マーク)を押下して起動しているが、Tomcatだけをコマンドから動かすにはどうしたらいいかやってみた。

本体はTomcatフォルダ内のbinディレクトリにある。

apacheのサイトからダウンロードしたtomcatのファイルを解凍したなかにbinディレクトリがあるので、その中のシェルを実行するだけ。
なのでtomcatフォルダごと動かす分にはどこへ置いても動く。
サーバを起動するスクリプトはstartup.shなので、これを起動すればいい。
ただし、これらのシェルには初め実行権限がないので、
例えばtomcatフォルダのルートをホーム直下の ~/tomcat8とつけたとすると、

terminal
chmod -R 755 ~/tomcat8

のようにしてオーナーに実行権限を与えておく。
数字は必要に応じて740とか厳しくしてください。

その後

terminal
cd ~/tomcat8/bin/
sh startup.sh

とするとサーバが起動するので
ブラウザで
http://localhost:8080
して、
スクリーンショット 2020-02-22 18.57.31.png
このページが開いたら成功です。

あとは
~/tomcat8/webapps/examples/index.jsp が
http://localhost:8080/examples/index.jsp のように対応するので
自分のプロジェクトを配置して使用します。

また
~/tomcat8/logs/catalina.out にログが
出力されているので

terminal
tail -f ~/tomcat8/logs/catlina.out

でeclipseのログ画面のようなものが見えます。

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

ListViewが複数ある時に押下したリストによって、処理を変える方法

はじめに

ListViewが以下のようにタッチしたときに、タッチしたリストによって処理を変える方法です。

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/food"
    android:id="@+id/food"></ListView>
<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/drink"
    android:id="@+id/drink"></ListView>

コード

フードのリストをタッチしたときは「あなたが選んだ食べ物は○○」、
ドリンクのリストをタッチしたときは「あなたが選んだ飲み物は○○」と表示されるトーストを作ってみます。

strings.xml
<resources>
    <string name="app_name">ListView</string>
    <string name="text_food">フード</string>
    <string name="text_drink">ドリンク</string>
    <string-array name="food">
        <item></item>
        <item></item>
    </string-array>
    <string-array name="drink">
        <item>ジュース</item>
        <item>お茶</item>
    </string-array>
</resources>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/text_food"/>
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/food"
        android:id="@+id/food"></ListView>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/text_drink"/>
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/drink"
        android:id="@+id/drink"></ListView>

</LinearLayout>
MainActivity.java
package com.websarva.wings.android.listview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        ListView foodListView = findViewById(R.id.food);
        ListView drinkListView = findViewById(R.id.drink);

        foodListView.setOnItemClickListener(new ListItemClickListener());
        drinkListView.setOnItemClickListener(new ListItemClickListener());
    }

    /**
     * ListView内のitem押下時の処理
     */
    private class ListItemClickListener implements AdapterView.OnItemClickListener{
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            ListView foodList = findViewById(R.id.food);
            ListView drinkList = findViewById(R.id.drink);

            String item = (String) parent.getItemAtPosition(position);
            String show;

            if(parent == foodList){
                show = "あなたが選んだ食べ物は" + item;
                Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
            }

            if (parent == drinkList){
                show = "あなたが選んだ飲み物は" + item;
                Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
            }
        }
    }
}

実行結果

新しいビットマップ イメージ.jpeg

左で表示されているトーストは肉をタッチしたので、「あなたが選んだ食べ物は○○」が表示、
右で表示されているトーストはジュースをタッチしたので、「あなたが選んだので、飲み物は○○」
が表示されています。

解説

 private class ListItemClickListener implements AdapterView.OnItemClickListener{
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            ListView foodList = findViewById(R.id.food);      ・・・➀
            ListView drinkList = findViewById(R.id.drink);    ・・・➀

            String item = (String) parent.getItemAtPosition(position);
            String show;

            if(parent == foodList){                           ・・・➁
                show = "あなたが選んだ食べ物は" + item;
                Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
            }

            if (parent == drinkList){                         ・・・➁
                show = "あなたが選んだ飲み物は" + item;
                Toast.makeText(MainActivity.this,show,Toast.LENGTH_LONG).show();
            }
        }
    }

➀ListViewのIDを取得する

どのリストがタッチされたか判別するために、findViewByIdメソッドを使用して各ListViewのIDを取得する。

➁タッチされたListViewによって、処理を変える

➀で取得したIDをparentと比較して、タッチされたListViewを判別して、処理を実行する。
※parentはタッチされたリスト全体。

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

【Java】ソースコード実行の流れ

ソースコードが実行されるまでの流れ

1. ソースコードの作成

2. コンパイル

3. 実行

簡単に言うとこんな感じです:smile:
初心者の私には簡単に言われてもさっぱりでした:thinking:
コンパイルとはなんぞや・・・???という感じです:sweat_smile:

少しずつどんなものかを説明したいと思います:smile:
おそらくこのような感じではないかと思うのですが
認識違い等あればご指摘ください:smile:

1. ソースコードの作成 → 2. コンパイル

ソースコードはおわかりの方が多いのではないでしょうか?
私達が作成する下記のようなプログラムのことです:smile:

例.java
public class Main {
    public static void main(String[] args) {
        System.out.println("hello, world!");
    }
}

さて、このプログラム。
せっかく私達が端正こめてコード作成しても、残念ながらパソコンくんはこのままでは理解ができません:rolling_eyes:

日本語のわからない海外の人に日本語で話しても海外の人は理解できませんよね:sweat_smile:

english_kaiwa_bad_man.png

ではどうすればいいのかというと・・・擬人化すればイメージがつかみやすいかと思います:smile:

お互いの言葉がわかるひとにあいだに入ってもらって通訳してもらえばいいですよね:laughing:

その通訳をしてくれるのがコンパイルです:laughing:

おじさんわらう.png

このコンパイルは人が書いたソースコードを機械の言葉に翻訳してくれるという特徴を持っています。

:bulb:コンパイル特徴:bulb:
:sunny: ソースファイルをクラスファイルに変換する
:sunny: 変換したクラスファイルにはバイトコードと呼ばれるものが入っている。
:sunny: コンパイルはコンパイラというソフトを使って上記作業をする。
:sunny: コンパイラはソースコードの文法チェックもする

ソースファイルをクラスファイルに変換するというのは、
ファイル名.java → ファイル名.class
に拡張子を変換するということです。

拡張子というのは
メモなら .txt
Wordなら .docx
Excelなら .xlsx
PDFなら .pdf
など、ファイル名のあとに記載されているヤツです。

話を戻しますね:smile:

そしてクラスファイルに変換したもののなかにバイトコードと呼ばれるものが入っているのですが、このバイトコードというのは 0 と 1 が複雑にならんだものです。
つまり私達がつくったソースコードが0と1で形成されたものに変換されてしまうのです。

ファイル名 ソースファイル クラスファイル
ファイルの中身 ソースコード バイトコード

ソースファイルをクラスファイルに変更するということはファイルの拡張子を修正すればいいの?:thinking:

とも思いますが、おそらくエラーになります。

どうするのかというと コンパイラ というソフトを使います。
コンパイル に コンパイラ ・・・ややこしい:sweat_smile:

さて、このコンパイラ。
私達が作成したソースコードの文法チェックもしてくれます。

ねぇ、英語のつづり間違ってるんじゃない?
ねぇ、カッコがたりないんじゃない?

などチェックしてくれます。
ちなみにこれらを修正するまでコンパイルしてくれません。
ずーっと差し戻されます:sweat_smile:

2. コンパイル → 3. 実行

機械の言葉に翻訳してもらったし、いよいよプログラム実行だー!:fist:
と思ってしまいますが、ちょっと待ったー!:hand_splayed:です。

じつはこのままだとまだ動作しないのです。
機械の言葉に変換したんだから実行できるんじゃないの!?!?と思います。
少なくとも私は思っていました:sweat_smile:

ソースコードに比べたら実行できる姿ではあるものの実行はできないのです。

またまた擬人化して考えると、さきほど翻訳をしてくれたコンパイルおじちゃん。
翻訳してくれたのはいいけど方言がきつすぎて相手にはイマイチ伝わっていませんでした・・・みたいな感じかな:sweat_smile:

おじさんてへぺろ.png

そうなるとこのコンパイルおじちゃんの方言を標準語に通訳してくれる人が必要です。
それが・・・

おんなわらう.png

インタプリタさんです:smile:

:bulb:インタプリタ特徴:bulb:
:sunny: バイトコードの変換と実行を依頼
:sunny: JVM というしくみをもつ

コンパイルおじちゃんが翻訳してくれたバイトコードをインタプリタさんがマシンコードと呼ばれる機械語に変換します。

この翻訳したマシンコードをCPUに送って処理を実行してもらいます。
(CPUとはパソコンの脳みそ部分でマシンコードを理解して命令を実行したり計算したりする働きをもちます)

JVM というのはバイトコードを少しずつ読み込みながらCPUに命令を実行してもらいます。

たとえば

例.
ここはどこですか?
駅にはどのようにいけばいいですか?
駅までどのくらい時間がかかりますか?

という質問を投げかけたとします。
すると・・・

ここはどこですか?

翻訳

ニューヨークです

駅にはどのようにいけばいいですか?

翻訳

次の角を左にまがって、そのまま真っすぐです

駅までどのくらい時間がかかりますか?

翻訳

10分くらいです。

イメージとしては同時通訳に近い感じですかね??
相手の話を全部聞いてから翻訳するのではなく、
話を聞きつつ通訳していくような。

このような流れでJavaのプログラムは実行されていきます:smile:

ちなみにこのインタプリタさんもコンパイラと一緒でソフトウェアの1つです。
なのでコンパイラとインタプリタをインストールしないと Java は使えないということです。

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

【Java】ソースコードから実行するまでの流れ

ソースコードから実行されるまでの流れ

  1. ソースコードの作成
  2. コンパイル
  3. 実行

簡単に言うとこんな手順です:smile:
初心者の私には簡単に言われてもさっぱりでした:thinking:
コンパイルとはなんぞや・・・???という感じです:sweat_smile:

少しずつどんなものかを説明したいと思います:smile:
おそらくこのような感じではないかと思うのですが
認識違い等あればご指摘ください:smile:

1. ソースコードの作成 → 2. コンパイル

ソースコードはおわかりの方が多いのではないでしょうか?
私達が作成する下記のようなプログラムのことです:smile:

例.java
public class Main {
    public static void main(String[] args) {
        System.out.println("hello, world!");
    }
}

さて、このプログラム。
せっかく私達が端正こめてコード作成しても、残念ながらパソコンくんはこのままでは理解ができません:rolling_eyes:

日本語のわからない海外の人に日本語で話しても海外の人は理解できませんよね:sweat_smile:

english_kaiwa_bad_man.png

ではどうすればいいのかというと・・・擬人化すればイメージがつかみやすいかと思います:smile:

お互いの言葉がわかるひとにあいだに入ってもらって通訳してもらえばいいですよね:laughing:

その通訳に相当するのがコンパイルです:laughing:

  • interprit:(会話の場で)通訳する(動詞)
  • interpriter: 通訳者(名詞)
  • compile:(事前に)翻訳する(動詞)
  • compiler: 翻訳者(名詞)

おじさんわらう.png

このコンパイルは人が書いたソースコードを機械の言葉に翻訳してくれるという特徴を持っています。

:bulb:コンパイル特徴:bulb:
:sunny: ソースファイルをクラスファイルに変換する
:sunny: 変換したクラスファイルにはバイトコードと呼ばれるものが入っている。
:sunny: コンパイルはコンパイラというソフトを使って上記作業をする。
:sunny: コンパイラはソースコードの文法チェックもする

ソースファイルをクラスファイルに変換するというのは、
ファイル名.java → ファイル名.class
に拡張子を変換するということです。

拡張子というのは
メモなら .txt
Wordなら .docx
Excelなら .xlsx
PDFなら .pdf
など、ファイル名のあとに記載されているヤツです。

話を戻しますね:smile:

そしてクラスファイルに変換したもののなかにバイトコードと呼ばれるものが入っているのですが、このバイトコードというのは 0 と 1 が複雑にならんだものです。
つまり私達がつくったソースコードが0と1で形成されたものに変換されてしまうのです。

ファイル名 ソースファイル クラスファイル
ファイルの中身 ソースコード バイトコード

ソースファイルをクラスファイルに変更するということはファイルの拡張子を修正すればいいの?:thinking:

とも思いますが、おそらくエラーになります。

どうするのかというと コンパイラ というソフトを使います。
コンパイル に コンパイラ ・・・ややこしい:sweat_smile:

さて、このコンパイラ。
私達が作成したソースコードの文法チェックもしてくれます。

ねぇ、英語のつづり間違ってるんじゃない?
ねぇ、カッコがたりないんじゃない?

などチェックしてくれます。
ちなみにこれらを修正するまでコンパイルしてくれません。
ずーっと差し戻されます:sweat_smile:

2. コンパイル → 3. 実行

機械の言葉に翻訳してもらったし、いよいよプログラム実行だー!:fist:
と思ってしまいますが、ちょっと待ったー!:hand_splayed:です。

じつはこのままだとまだ動作しないのです。
機械の言葉に変換したんだから実行できるんじゃないの!?!?と思います。
少なくとも私は思っていました:sweat_smile:

ソースコードに比べたら実行できる姿ではあるものの実行はできないのです。

またまた擬人化して考えると、さきほど翻訳をしてくれたコンパイルおじちゃん。
翻訳してくれたのはいいけど方言がきつすぎて相手にはイマイチ伝わっていませんでした・・・みたいな感じかな:sweat_smile:

おじさんてへぺろ.png

そうなるとこのコンパイルおじちゃんの方言を標準語に通訳してくれる人が必要です。
それが・・・

おんなわらう.png

インタプリタさんです:smile:

:bulb:インタプリタ特徴:bulb:
:sunny: バイトコードの変換と実行を依頼
:sunny: JVM というしくみをもつ

コンパイルおじちゃんが翻訳してくれたバイトコードをインタプリタさんがマシンコードと呼ばれる機械語に変換します。

この翻訳したマシンコードをCPUに送って処理を実行してもらいます。
(CPUとはパソコンの脳みそ部分でマシンコードを理解して命令を実行したり計算したりする働きをもちます)

JVM というのはバイトコードを少しずつ読み込みながらCPUに命令を実行してもらいます。

たとえば

例.
ここはどこですか?
駅にはどのようにいけばいいですか?
駅までどのくらい時間がかかりますか?

という質問を投げかけたとします。
すると・・・

ここはどこですか?

翻訳

ニューヨークです

駅にはどのようにいけばいいですか?

翻訳

次の角を左にまがって、そのまま真っすぐです

駅までどのくらい時間がかかりますか?

翻訳

10分くらいです。

イメージとしては同時通訳に近い感じですかね??
相手の話を全部聞いてから翻訳するのではなく、
話を聞きつつ通訳していくような。

このような流れでJavaのプログラムは実行されていきます:smile:

ちなみにこのインタプリタさんもコンパイラと一緒でソフトウェアの1つです。
なのでコンパイラとインタプリタをインストールしないと Java は使えないということです。

*補足*
1クラス完結のファイルに限り、Java11からコンパイルなしで実行できるようです:smile:
コメントくださりありがとうございます!!

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

Javaで正の数と負の数を判別する

Mathクラスのsignumメソッドを使う

Mathsignum.java
// double型で返します。
// 正の数であれば1.0、0であれば0.0、負の数であれば-1.0を返します。
System.out.print(Math.signum(10)); // 1.0
System.out.print(Math.signum(0)); // 0.0
System.out.print(Math.signum(-10)); // -1.0

Mathクラス

Math クラスは、指数関数、対数関数、平方根、および三角関数といった基本的な数値処理を実行するためのメソッドを含んでいます。

らしいです。

signumメソッド

引数の符号要素を返します。 引数がゼロの場合はゼロ、引数がゼロより大きい場合は 1.0、引数がゼロより小さい場合は -1.0 です。

言い回しは若干異なりますが、前述のコメントアウトにも書いてあるとおりです。

参考

クラス Math
signumメソッド|Javaコード入門

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