- 投稿日:2020-02-22T23:16:42+09:00
javaでAtCoder Beginner Contest 156を解く
AtCoder Beginner Contest 156お疲れ様でした!
公式ページ今回の自分の書いたコードはこちら
結果はA-DまでAC、Eはコンテスト終了後5分でACできました。悔しい以下簡単に解説します。
問題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使って数式書いてみました。やっぱり美しいですね
- 投稿日:2020-02-22T23:15:36+09:00
Struts2 を手動でwarファイルにしてデプロイするには
#目的
eclipseなしでStruts2をtomcatに配備する方法を知る。
前提:クラスファイルはコンパイル済みフォルダ構成
Struts2Calcというプロジェクトがあったとして、
トップページがindex.jsp
controllerパッケージにCalcAction.class
beanパッケージにCalcFormBean.classというのがあるとすると上図のようになる。
classファイルがbinとかにある場合はこのようにclassesフォルダを作って移動させておく。
struts.xmlなどもclassesフォルダ直下になる。warにする
terminalcd ~/JavaProjects/Struts2Calc jar cvf Struts2Calc.war -C WebContent .
で、warファイルができるので
これをtomcat/webapps/
に配置するとデプロイできる。実はwarにする必要はない
どこをみてもtomcatにデプロイするにはwarを作ってwebappsフォルダに入れるように書いていますが、
試しに上のフォルダ構成でwarにせずにそのままwebappsに持っていっても動きました。
warファイルの正体はzipファイルで、tomcatは単にそれを普通に解凍しているだけのようです。
とはいえwarにするのが常識なので普通はそうしたほうがいいです。
- 投稿日:2020-02-22T19:08:12+09:00
eclipseを使わずにTomcatのローカルサーバを立ち上げるには
目的
・ちょっとしたJavaの学習用に軽量な環境を構築する。
・Tomcatの仕組みを深く理解する。
普段はeclipseからサーバを起動ボタン(トム猫マーク)を押下して起動しているが、Tomcatだけをコマンドから動かすにはどうしたらいいかやってみた。本体はTomcatフォルダ内のbinディレクトリにある。
apacheのサイトからダウンロードしたtomcatのファイルを解凍したなかにbinディレクトリがあるので、その中のシェルを実行するだけ。
なのでtomcatフォルダごと動かす分にはどこへ置いても動く。
サーバを起動するスクリプトはstartup.shなので、これを起動すればいい。
ただし、これらのシェルには初め実行権限がないので、
例えばtomcatフォルダのルートをホーム直下の ~/tomcat8とつけたとすると、terminalchmod -R 755 ~/tomcat8
のようにしてオーナーに実行権限を与えておく。
数字は必要に応じて740とか厳しくしてください。その後
terminalcd ~/tomcat8/bin/ sh startup.sh
とするとサーバが起動するので
ブラウザで
http://localhost:8080
して、
このページが開いたら成功です。あとは
~/tomcat8/webapps/examples/index.jsp が
http://localhost:8080/examples/index.jsp のように対応するので
自分のプロジェクトを配置して使用します。また
~/tomcat8/logs/catalina.out にログが
出力されているのでterminaltail -f ~/tomcat8/logs/catlina.out
でeclipseのログ画面のようなものが見えます。
- 投稿日:2020-02-22T02:19:55+09:00
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.javapackage 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(); } } } }実行結果
左で表示されているトーストは肉をタッチしたので、「あなたが選んだ食べ物は○○」が表示、
右で表示されているトーストはジュースをタッチしたので、「あなたが選んだので、飲み物は○○」
が表示されています。解説
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はタッチされたリスト全体。
- 投稿日:2020-02-22T00:36:55+09:00
【Java】ソースコード実行の流れ
ソースコードが実行されるまでの流れ
1. ソースコードの作成
↓
2. コンパイル
↓
3. 実行簡単に言うとこんな感じです
初心者の私には簡単に言われてもさっぱりでした
コンパイルとはなんぞや・・・???という感じです少しずつどんなものかを説明したいと思います
おそらくこのような感じではないかと思うのですが
認識違い等あればご指摘ください1. ソースコードの作成 → 2. コンパイル
ソースコードはおわかりの方が多いのではないでしょうか?
私達が作成する下記のようなプログラムのことです例.javapublic class Main { public static void main(String[] args) { System.out.println("hello, world!"); } }さて、このプログラム。
せっかく私達が端正こめてコード作成しても、残念ながらパソコンくんはこのままでは理解ができません日本語のわからない海外の人に日本語で話しても海外の人は理解できませんよね
ではどうすればいいのかというと・・・擬人化すればイメージがつかみやすいかと思います
お互いの言葉がわかるひとにあいだに入ってもらって通訳してもらえばいいですよね
その通訳をしてくれるのがコンパイルです
このコンパイルは人が書いたソースコードを機械の言葉に翻訳してくれるという特徴を持っています。
コンパイル特徴
ソースファイルをクラスファイルに変換する
変換したクラスファイルにはバイトコードと呼ばれるものが入っている。
コンパイルはコンパイラというソフトを使って上記作業をする。
コンパイラはソースコードの文法チェックもするソースファイルをクラスファイルに変換するというのは、
ファイル名.java → ファイル名.class
に拡張子を変換するということです。拡張子というのは
メモなら .txt
Wordなら .docx
Excelなら .xlsx
PDFなら .pdf
など、ファイル名のあとに記載されているヤツです。話を戻しますね
そしてクラスファイルに変換したもののなかにバイトコードと呼ばれるものが入っているのですが、このバイトコードというのは 0 と 1 が複雑にならんだものです。
つまり私達がつくったソースコードが0と1で形成されたものに変換されてしまうのです。
ファイル名 ソースファイル クラスファイル ファイルの中身 ソースコード バイトコード ソースファイルをクラスファイルに変更するということはファイルの拡張子を修正すればいいの?
とも思いますが、おそらくエラーになります。
どうするのかというと コンパイラ というソフトを使います。
コンパイル に コンパイラ ・・・ややこしいさて、このコンパイラ。
私達が作成したソースコードの文法チェックもしてくれます。ねぇ、英語のつづり間違ってるんじゃない?
ねぇ、カッコがたりないんじゃない?などチェックしてくれます。
ちなみにこれらを修正するまでコンパイルしてくれません。
ずーっと差し戻されます2. コンパイル → 3. 実行
機械の言葉に翻訳してもらったし、いよいよプログラム実行だー!
と思ってしまいますが、ちょっと待ったー!です。じつはこのままだとまだ動作しないのです。
機械の言葉に変換したんだから実行できるんじゃないの!?!?と思います。
少なくとも私は思っていましたソースコードに比べたら実行できる姿ではあるものの実行はできないのです。
またまた擬人化して考えると、さきほど翻訳をしてくれたコンパイルおじちゃん。
翻訳してくれたのはいいけど方言がきつすぎて相手にはイマイチ伝わっていませんでした・・・みたいな感じかなそうなるとこのコンパイルおじちゃんの方言を標準語に通訳してくれる人が必要です。
それが・・・インタプリタさんです
インタプリタ特徴
バイトコードの変換と実行を依頼
JVM というしくみをもつコンパイルおじちゃんが翻訳してくれたバイトコードをインタプリタさんがマシンコードと呼ばれる機械語に変換します。
この翻訳したマシンコードをCPUに送って処理を実行してもらいます。
(CPUとはパソコンの脳みそ部分でマシンコードを理解して命令を実行したり計算したりする働きをもちます)JVM というのはバイトコードを少しずつ読み込みながらCPUに命令を実行してもらいます。
たとえば
例.ここはどこですか? 駅にはどのようにいけばいいですか? 駅までどのくらい時間がかかりますか?という質問を投げかけたとします。
すると・・・ここはどこですか?
↓
翻訳
↓
ニューヨークです駅にはどのようにいけばいいですか?
↓
翻訳
↓
次の角を左にまがって、そのまま真っすぐです駅までどのくらい時間がかかりますか?
↓
翻訳
↓
10分くらいです。イメージとしては同時通訳に近い感じですかね??
相手の話を全部聞いてから翻訳するのではなく、
話を聞きつつ通訳していくような。このような流れでJavaのプログラムは実行されていきます
ちなみにこのインタプリタさんもコンパイラと一緒でソフトウェアの1つです。
なのでコンパイラとインタプリタをインストールしないと Java は使えないということです。
- 投稿日:2020-02-22T00:36:55+09:00
【Java】ソースコードから実行するまでの流れ
ソースコードから実行されるまでの流れ
- ソースコードの作成
- コンパイル
- 実行
簡単に言うとこんな手順です
初心者の私には簡単に言われてもさっぱりでした
コンパイルとはなんぞや・・・???という感じです少しずつどんなものかを説明したいと思います
おそらくこのような感じではないかと思うのですが
認識違い等あればご指摘ください1. ソースコードの作成 → 2. コンパイル
ソースコードはおわかりの方が多いのではないでしょうか?
私達が作成する下記のようなプログラムのことです例.javapublic class Main { public static void main(String[] args) { System.out.println("hello, world!"); } }さて、このプログラム。
せっかく私達が端正こめてコード作成しても、残念ながらパソコンくんはこのままでは理解ができません日本語のわからない海外の人に日本語で話しても海外の人は理解できませんよね
ではどうすればいいのかというと・・・擬人化すればイメージがつかみやすいかと思います
お互いの言葉がわかるひとにあいだに入ってもらって通訳してもらえばいいですよね
その通訳に相当するのがコンパイルです
- interprit:(会話の場で)通訳する(動詞)
- interpriter: 通訳者(名詞)
- compile:(事前に)翻訳する(動詞)
- compiler: 翻訳者(名詞)
このコンパイルは人が書いたソースコードを機械の言葉に翻訳してくれるという特徴を持っています。
コンパイル特徴
ソースファイルをクラスファイルに変換する
変換したクラスファイルにはバイトコードと呼ばれるものが入っている。
コンパイルはコンパイラというソフトを使って上記作業をする。
コンパイラはソースコードの文法チェックもするソースファイルをクラスファイルに変換するというのは、
ファイル名.java → ファイル名.class
に拡張子を変換するということです。拡張子というのは
メモなら .txt
Wordなら .docx
Excelなら .xlsx
PDFなら .pdf
など、ファイル名のあとに記載されているヤツです。話を戻しますね
そしてクラスファイルに変換したもののなかにバイトコードと呼ばれるものが入っているのですが、このバイトコードというのは 0 と 1 が複雑にならんだものです。
つまり私達がつくったソースコードが0と1で形成されたものに変換されてしまうのです。
ファイル名 ソースファイル クラスファイル ファイルの中身 ソースコード バイトコード ソースファイルをクラスファイルに変更するということはファイルの拡張子を修正すればいいの?
とも思いますが、おそらくエラーになります。
どうするのかというと コンパイラ というソフトを使います。
コンパイル に コンパイラ ・・・ややこしいさて、このコンパイラ。
私達が作成したソースコードの文法チェックもしてくれます。ねぇ、英語のつづり間違ってるんじゃない?
ねぇ、カッコがたりないんじゃない?などチェックしてくれます。
ちなみにこれらを修正するまでコンパイルしてくれません。
ずーっと差し戻されます2. コンパイル → 3. 実行
機械の言葉に翻訳してもらったし、いよいよプログラム実行だー!
と思ってしまいますが、ちょっと待ったー!です。じつはこのままだとまだ動作しないのです。
機械の言葉に変換したんだから実行できるんじゃないの!?!?と思います。
少なくとも私は思っていましたソースコードに比べたら実行できる姿ではあるものの実行はできないのです。
またまた擬人化して考えると、さきほど翻訳をしてくれたコンパイルおじちゃん。
翻訳してくれたのはいいけど方言がきつすぎて相手にはイマイチ伝わっていませんでした・・・みたいな感じかなそうなるとこのコンパイルおじちゃんの方言を標準語に通訳してくれる人が必要です。
それが・・・インタプリタさんです
インタプリタ特徴
バイトコードの変換と実行を依頼
JVM というしくみをもつコンパイルおじちゃんが翻訳してくれたバイトコードをインタプリタさんがマシンコードと呼ばれる機械語に変換します。
この翻訳したマシンコードをCPUに送って処理を実行してもらいます。
(CPUとはパソコンの脳みそ部分でマシンコードを理解して命令を実行したり計算したりする働きをもちます)JVM というのはバイトコードを少しずつ読み込みながらCPUに命令を実行してもらいます。
たとえば
例.ここはどこですか? 駅にはどのようにいけばいいですか? 駅までどのくらい時間がかかりますか?という質問を投げかけたとします。
すると・・・ここはどこですか?
↓
翻訳
↓
ニューヨークです駅にはどのようにいけばいいですか?
↓
翻訳
↓
次の角を左にまがって、そのまま真っすぐです駅までどのくらい時間がかかりますか?
↓
翻訳
↓
10分くらいです。イメージとしては同時通訳に近い感じですかね??
相手の話を全部聞いてから翻訳するのではなく、
話を聞きつつ通訳していくような。このような流れでJavaのプログラムは実行されていきます
ちなみにこのインタプリタさんもコンパイラと一緒でソフトウェアの1つです。
なのでコンパイラとインタプリタをインストールしないと Java は使えないということです。*補足*
1クラス完結のファイルに限り、Java11からコンパイルなしで実行できるようです
コメントくださりありがとうございます!!
- 投稿日:2020-02-22T00:13:53+09:00
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.0Mathクラス
Math クラスは、指数関数、対数関数、平方根、および三角関数といった基本的な数値処理を実行するためのメソッドを含んでいます。
らしいです。
signumメソッド
引数の符号要素を返します。 引数がゼロの場合はゼロ、引数がゼロより大きい場合は 1.0、引数がゼロより小さい場合は -1.0 です。
言い回しは若干異なりますが、前述のコメントアウトにも書いてあるとおりです。
参考