JAVA関連のことを調べてみた2019年12月01日

JAVA関連のことを調べてみた2019年12月01日

Javaで簡単なソートを一つかけてみる

#やりたいこと
ある自作のプログラムにデータを渡し、そのプログラムにソートさせてみて、性能テストをしてみます。その時ソートする関数やライブラリの類は一切使わないで作ります。
#なぜやろうと思ったか
理由は単純、塾の友達とソートの数学的なアルゴリズムについて語ってたら作ってみたくなってきたから組んでみます!
#アルゴリズム
与えられた配列変数に対して、k番目の要素とk+1番目の要素を比較して、もしもk+1番目の要素のほうが小さければ2つの値を入れ替えます。この操作を繰り返すことで、最終的には配列変数の配列の順序で小さい方からデータが並びます。
#具体的なコード
データを大量に用意してテストしたいので、今回は現在時刻(ミリ秒)をシードとして乱数を生成し、それを実験用データとして使うことにしました。Javaで実装します。

“`java:class
public static int[] sortonce(int[] data){
int temp=0;
int number=data.length;
int tmp0=0;
int tmp1=0;
for(int cy

元記事を表示

IDEやMavenはすべてのデバッグ情報を含めてコンパイルしてくれている

`javac`には`-g`というオプションがあります。これはクラスファイルへデバッグ情報を含めたり、逆に含めない設定をするためのオプションです。

– `-g:lines`とすればソースコードの行番号を含めます
– `-g:vars`とすればローカル変数名の情報を含めます
– `-g:source`とすればソースファイル名を含めます
– `-g`とすればすべてのデバッグ情報を含めます
– `-g:none`とすればデバッグ情報を何も含めません

次のようなコードを`javac -g Hello.java`したとします。

“`java
public class Hello {
public String say(String name) {
return “hello “.concat(name);
}
}
“`

それから`javap -l Hello`すると次のようになります(`-l`は行番号とローカル変数表を出力するオプションです)。

“`
Compiled from “Hello.java”
public class Hello {

元記事を表示

[Java] Core Java Reading Memo

Keep result of mod be positive.

“`java
Math.floorMod(-1, 10); // 9
“`

Quick-and-dirty list of the elements of a two-dimensional array

“`java
System.out.println(Arrays.deepToString(arrays));
“`

元記事を表示

Find Maximum in Sliding Window

# Find Maximum in Sliding Window

## 説明
整数の配列とサイズ w のWindow が与えられた場合、Window (配列の一部)が配列全体をスライドするときに Window中の 現在の最大値を見つけます。

##例
Window の Sizeが 3 で、スライディングしていく中で、すべての最大値を見つけてみましょう。

![Screen Shot 2019-11-30 at 4.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405022/4fb141a6-6f34-50e4-5aa2-6630a637e84e.png)

###step1
Window の三つの要素の中の最大値が 2
![Screen Shot 2019-11-30 at 4.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405022/39845b0b-bb43-a119-0d94-48dd

元記事を表示

Java(set)

【set】
ArrayListの要素を書き換える際に使用するメソッドである。
以下のように変更したい場所と値を入れて使用する。
変数名.set(インデックス,書き換える値)

Java(add)の回で使用したArrayList「array」に
setメソッドで指定した場所の要素を書き換える。

ArrayList array = new ArrayList();

array.add(“日本語”);
array.add(“英語”);
array.add(“フランス語”);
array.add(“中国語”);
array.add(“ドイツ語”);

System.out.println(array);

[日本語, 英語, フランス語, 中国語, ドイツ語]

インデックス3の「中国語」を「韓国語」に変更する。

array.set(3,”韓国語”);
System.out.println(array);

リストの中を出力すると以下のようになる。

[

元記事を表示

Java(add2)

前回使用したArrayList「array」にaddメソッドで指定の場所へ要素を追加挿入する。

ArrayList array = new ArrayList();

array.add(“日本語”);
array.add(“英語”);
array.add(“フランス語”);
array.add(“中国語”);
array.add(“ドイツ語”);

System.out.println(array);

[日本語, 英語, フランス語, 中国語, ドイツ語]

インデックス1へ要素「イタリア語」を挿入する。

array.add(1,”イタリア語”);
System.out.println(array);

リストの中を出力すると以下のようになる。

[日本語, イタリア語, 英語, フランス語, 中国語, ドイツ語]

指定した場所に要素が挿入され、それ以降の要素が後ろにズレる。
因みに、存在しない場所を指定して要素を挿入しようとすると
「IndexOu

元記事を表示

Arrays.binarySearchは完全一致

“`java
// 注: アルゴリズムの性質上ソートされていないとうまく機能しない
int[] array = {2, 3, 4, 7, 8, 9, 14, 23, 56, 67, 78, 89, 90};

// NOT FOUND
int index = Arrays.binarySearch(array, 5);
“`

さて、これが何を返すだろうか?
答えは`-4`だ。
[javadoc](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#binarySearch-int:A-int-)によれば:
> **戻り値**:
配列内に検索キーがある場合は検索キーのインデックス。それ以外の場合は(-(挿入ポイント) – 1)。挿入時点は、そのキーが配列に挿入される時点として定義される。つまり、そのキーよりも大きな最初の要素のインデックス。

こんな翻訳で分かるかっ!
参考:
> **戻り値**:
配列内に検索キーがある場合は検索キーのインデックス。それ以外の場合は(-(挿入添字) – 1)。ここで、

元記事を表示

Algorithm Binary Search on Arrays

#Binary Search

##説明
ソートされた整数を保存するArrayと探してるキーが渡されて、もしそのキーがArrayの中にある場合はキーのIndexを返す。もし、そのキーが無ければ-1を返す。

##例
キーが47で要素20個を保持するArray

![Screen Shot 2019-11-30 at 0.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405022/d54f8fcf-2539-107f-339f-c9886ab69b6e.png)

##Solution

###Runtime Complexity: O(logn)
###Memory Complexity: O(logn)

Binary Searchは、ソートされた配列内の要素のインデックスを見つけるために使用されます。 要素が存在しない場合もそれも同様に効率的に見つけることが出来ます。アルゴリズムは、各ステップで入力配列を半分に分割していきます。すべてのステップの後、探しているインデックスが見つかったかど

元記事を表示

JavaでBoyer-Mooreの実装

アルゴリズムの勉強、Javaの文法を勉強するために、文字列検索アルゴリズムの一つであるBoyer-Moore法を実装しました!!

#Boyer-Moore法とは?
ボイヤー・ムーア法(1976年)
R.S.Boyer と J.S.Moore が提案
単純検索アルゴリズムよりも高速なアルゴリズム
文字の比較結果によってずらす位置を変える
時間計算量は単純検索アルゴリズム以下

他にも文字列検索のアルゴリズムは、単純検索法とかラビンカープ法等色々あります。

#Skip表

検索する前にスキップ表というものを作ります。

検索パターン:ighi

だったとして、

|パターン|i|g|h|i|
|:-:|:-:|:-:|:-:|:-:|
|ずらし幅|3|2|1|0|

となりますが、重複する文字列があった場合、小さい方を優先します。

したがって、

|パターン|g|h|i|デフォルト|
|:-:|:-:|:-:|:-:|:-:|
|ずらし幅|2|1|0|4|

となります。

デフォルトは、文字比較が重複しないところまで、Skipするために、設けています。
パターンを自然数でカウント

元記事を表示

初めてやるDDDでデジモンをモデリングする その1

アドベントカレンダー書くための考えた流れを残しておくメモです。

自社でDDDやってるけど、DDD実践したことがない。
個人でお試しでDDDやってみよう。
好きなことの方がモデリングしやすいのでは?
と思い、昔好きだったデジモンアドベンチャーをDDDで表して見ようと思い、
今に至る。

経験ないので、
技術書店で買った
もくもくモデリングの森を旅するチビドラゴンの軌跡
https://taimen.jp/f/867
を参考に試行してみる

# 題材
デジモンアドベンチャーといえば、
デジモンの進化も良し、
子どもたちの成長も良しと
色々ありますが、
広げすぎると何もできないので、
今回は「アグモン」を題材にやってみます。

# いざモデリング
## ユースケース
本に「誰が何をするとこうなる」を書き出してみようとあるので書いてみた。

– アグモンが進化するとグレイモンになる
– グレイモンが超進化するメタルグレイモンになる
– グレイモンが暗黒進化するとスカルグレイモンになる
– メタルグレイモンが究極進化するとウォーグレイモンになる
– アグモンがワープ進化するとウォーグレイモンに

元記事を表示

大文字小文字を区別しないという不幸な世界のワイルドカード(macOS)

# この記事について

macOS のファイルシステムは、デフォルトでは殆どのディレクトリで大文字小文字を区別しない。
そのような世界で、ワイルドカードを用いると何がマッチするか、という話。

# 大文字小文字を区別しないということ

例えばこんなスクリプトを実行すると

“`bash:bash

#!/bin/bash

set -eu

# ASCII の英数字
touch foo.txt FOO.txt
ls *.txt && rm *.txt

# 所謂全角文字
touch zen.txt ZEN.txt
ls *.txt && rm *.txt

# ギリシャ文字・キリル文字・ローマ数字
touch ωяⅶ.txt ΩЯⅦ.txt
ls *.txt && rm *.txt

# DZ, NJ
touch dz.txt # U+01F3 Latin Small Letter DZ
touch Dz.txt # U+01F2 Latin Capital Letter D with Small Letter z
touch DZ.txt # U+01F1 Latin Capital L

元記事を表示

Java Tips

String
 ・文字列の操作は、StringBuilderを利用することでパフォーマンスが向上
  →特にループ内で+での文字列結合を行わないこと

“`java:bad.java
static String concat(String[] array) {
String result = “”;
for (String s : array) {
result += s; //
}
return result;
}
“`

“`java:better.java
static String concat(String[] array) {
StringBuiler result = new StringBuiler();
for (String s : array) {
result.append(s);
}
return result.toString();
}
`

元記事を表示

Java Optional型

“`java:sample.java
import java.util.Optional;

public class Main {
void exec(Optional pSb) {

System.out.println(“pSb–>” + pSb);

StringBuilder sbEdit = pSb.orElseGet(() -> new StringBuilder(“none”)); //
System.out.println(“orElseGet–>” + sbEdit ); — “none”

// 引数の編集
Optional os = pSb.map(sb -> {
sb.insert(0, “[“);
sb.append(“]”);
return sb.toString();
});
}

public static

元記事を表示

SpringのLocalTimeをMySQLのTimeでINSERTしたい(millisecondsも)

## 概要

String型で取得した “`11:12:13.14“` (時間:分:秒.ミリ秒)を
MySQLにINSERTして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33237/080f5da5-0b53-2f27-2bf1-80b2ce500196.png)
とミリ秒まで表示させる方法についてです。(日付情報はいらない)

***そんなの普通に実装すればできそうじゃない?***
って思うじゃないですか。

簡単そうに見えて面倒くさい処理を挟まないとうまくいきませんでした。。。
もっとスマートな方法をお存じの方がいましたら、教えていただけるととっても嬉しいです!!

## バージョン

### Spring

“`build.gradle
id ‘org.springframework.boot’ version ‘2.2.2.BUILD-SNAPSHOT’
sourceCompatibility = ‘1.8’

runtimeOnly(‘mysql:mysql-c

元記事を表示

AndroidStudioでFileInputStreamを使うときの文字化けについて

実機デバッグ時に文字列をメールアプリの本文に渡したら、文章の間に文字化け記号が挟まった。
#AndroidStudioの基本的な設定
ここを見る。

http://k-hiura.cocolog-nifty.com/blog/2015/07/androidstudio-b.html

##FileInputStreamで文字コードをUTF-8指定にする
文字化けするコード

“`
public String readFile(String fileName){
try {
FileInputStream stream = openFileInput(fileName);
byte[] buf = new byte[1024];
stream.read(buf);
return new String(buf);
} catch (FileNotFoundException e) {
e.printStackTrace();

元記事を表示

生成したjarファイルをEclipseでデバッグする方法

※Eclipse英語版が前提です。Pleiadesなど使っている場合は、適宜日本語に読み替えてください

#jarファイルをブレークポイントを使ってデバッグしたい場合の方法

## Eclipse側の設定
プロジェクトのフォルダ上で右クリックして、
Debug As > Debug Configurations…を選択

![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501968/2ef72079-dd8d-55ce-94d3-71b1bcb4809f.png)

Remote Java Applicationsでダブルクリック
設定画面が開くので、Host:localhost port:任意のポートで設定を保存
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501968/00810a82-a6f3-da8a-cf94-f657e9e3de18.png

元記事を表示

AWS LambdaでJavaのフレームワークを使うには!?

### TL;DR

AWS LambdaでJavaのフレームワーク、たとえばSpringBootなどを使いたいって思ったことありませんか?

結論としては、AWS Lambdaの上に、[aws-serverless-java-container](https://github.com/awslabs/aws-serverless-java-container)フレームワークというプロキシフレームワークを入れれば比較的簡単に実現可能です。

今日は、そのあたりを、このAWSブログを軽く意訳しつつ書いていきたいと思います。

[AWS Open Source Blog Running APIs Written in Java on AWS Lambda](https://aws.amazon.com/jp/blogs/opensource/java-apis-aws-lambda/)

### 背景

Java開発者は、SpringやSpring BootからJersey、Sparkといった慣れ親しんだフレームワークで開発していることが多いのではないでしょうか。

これらのフレームワーク

元記事を表示

JJUG CCC 2019 Fall スライド一覧

## スライド一覧
[JJUG CCC 2019 Fall](https://ccc2019fall.java-users.jp/)のスライド一覧です。

## スライド 10:00 – 10:45

### [試して学ぼう、Java EE アプリケーションをOpenShift(Minishift)でデプロイ!](https://jjug-cfp.cfapps.io/submissions/bc66034f-d71c-4ec2-91da-1e7d4071ee38)
– [Java-minishift-20191123](https://www.slideshare.net/osonoi1/javaminishift20191123)

## [Head toward Java 13 and Java 14](https://jjug-cfp.cfapps.io/submissions/cf294061-c8af-4dfd-9825-63b16ce09352)
– [Head toward Java 13 and Java 14 #jjug](https://www.slideshar

元記事を表示

GitHub Actionsでコードレビュー前にフォーマッタをかける

突然ですがJavaのコード、なにで書いてますか?

私見ですが、ショートカットキーが手に馴染んだIDEとそうでないIDEでは明らかに作業効率が変わる気がします。
「IDEが選べる」「PCが選べる」はエンジニア採用の現場でも売りとして扱われているようですし、実際選べない会社より選べる会社の方が嬉しい。
ただ、実際選べる環境に入ってみると、それはそれでこんな状況が起こりがち。

1. Eclipseで書かれたコードをIntelliJ愛用者が編集(逆もまたしかり)
2. 手癖でフォーマッタをかける
3. コードの差分が大変なことになる
4. レビューつらみ

フォーマッタはできれば統一したいところ。
一方で「ソースコードプッシュするときは、ビルドツールでフォーマットしてからにしましょう」とかルール化するのもそれはそれで面倒。
pre-commitのセッティングを各人にお願いしてもいいのですが、GitHub使ってるならそっちで勝手にやってくれれば楽なはず!

というわけで、設定してみました。
ビルドツールやフォーマッタはプロジェクトによって色々かとは思いますが、本記事ではGradle+Goog

元記事を表示

Java変数のvolatile修飾子とは?

# volatile修飾子の概要
– 変数に付与する修飾子だよ。場合によってはsynchronizedの代わりに使える。
– 以下が利用例。

“`Java
private static volatile int count = 0;
“`

# 役割1: キャッシュ値からの読み取りを禁止する
– マルチスレッドが使われている場合、各スレッドがフィールドの値をキャッシュすることがある。このキャシュの対象外にする役割(パフォーマンス向上のために、各スレッドが変数のコピーを用意するため、メインメモリの値に変更があると、スレッド内の値と乖離が発生する可能性がある)
– volatileつけると**この変数はメインメモリから読み込んでね**というお願いができる。

# 役割2: コンパイル時の最適化の対象外にする
– Javaのコンパイル時には無駄な評価をなくすように最適化が行われる。

“`
# 以下のようなコードは…
boolean flg = true;
while(flg){
System.out.println(“hello!”);
}

# 以下のように最適化さ

元記事を表示

OTHERカテゴリの最新記事