20210303のJavaに関する記事は12件です。

【Java8】TreeSet<クラス>での並び替え順&中からもっとも近いものを取得

課題:一列のクラスリストをある順番で並び替え、そして中から目標クラスと等しい、なければそれよりもっとも近い(以下でも以上でも)のを取得

色々調べて、TreeSetというものにたどり着いたんです。今まではSet,ArrayListのようなを使ってきたが、これを使うの初めてです。
クラスのTreeSetを作るには並び順番を決める必要があるそうです。

例のクラス:

public class Person {

    private int id;

    private int age;

    private String name;
}

このクラスで並びの優先度は

ID > AGE > NAME

とします。

並び替え

Java8でTreeSetを作る同時に上記の並び順のComparatorを一緒に入れます。

TreeSet<Person> set = new TreeSet<>(Comparator.comparing(Person::getId)
.thenComparing(Person::getAge)
.thenComparing(Person::getName)
);

そしていくつかのPersonを入れます

入れるもの
personA.setId(3);
personA.setAge(10);
personA.setName("A");

personA2.setId(3);
personA2.setAge(5);
personA2.setName("A2");

personB.setId(2);
personB.setAge(5);
personB.setName("B");

personB2.setId(2);
personB2.setAge(10);
personB2.setName("B2");

personC.setId(1);
personC.setAge(3);
personC.setName("C");

personC2.setId(1);
personC2.setAge(3);
personC2.setName("C2");

set.add(personA);
...
...

入れた後の結果はこんな感じです

set.forEach(item -> {
            System.out.print("Id : " + item.getId() + " , ");
            System.out.print("Age : " + item.getAge() + " , ");
            System.out.println("Name : " + item.getName());
});
Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A

ちゃんと ID > Age > Nameの順番で並んでいます!

取得

次は等しい、なければもっとも近いものを取得です!

使うのmethodは下記です

Person targetPerson = new Person();
targetPerson.setId(1);
targerPerson.setAge(5);
targetPerson.setName("B");

//等しくものがなければ目標より以上もっとも近いもの
Person ceiling = set.ceiling(targetPerson);

//等しくものがなければ目標より以下もっとも近いもの
Person floor = set.floor(targerPerson);

//目標より以上もっとも近いもの
Person higher = set.higher(targerPerson);
//目標より以下もっとも近いもの
Person lower = set.lower(targerPerson);

さっきの結果から

Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A

Target: 
Id : 1 , Age : 5 , Name : B

Ceiling Result : 
Id : 2 , Age : 5 , Name : B
Floor Result : 
Id : 1 , Age : 3 , Name : C2

Higher Result : 
Id : 2 , Age : 5 , Name : B
Lower Result : 
Id : 1 , Age : 3 , Name : C2

Ceiling、FloorとHigher、Lower両方とも同じ結果を取得できるが、違いは同じものを取るかどうかだけです

Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B  //Targetと全く同じ
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A

Target: 
Id : 2 , Age : 5 , Name : B

Ceiling Result : 
Id : 2 , Age : 5 , Name : B
Floor Result : 
Id : 2 , Age : 5 , Name : B

Higher Result : 
Id : 2 , Age : 10 , Name : B2
Lower Result : 
Id : 1 , Age : 3 , Name : C2

以上です!自由にお試してください!
TreeSetの他の取得は公式Docで
https://docs.oracle.com/javase/jp/8/docs/api/java/util/TreeSet.html

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

Javaで学ぶアルゴリズム 第9弾:テイラー展開

#Javaで学ぶアルゴリズム < テイラー展開 >

はじめに

Javaは授業で触れただけで全くの初心者であり,何もわかっていない.なので,基本的なアルゴリズムをJavaで実装し,アルゴリズムの理解を深めるとともに,Javaにも慣れていきたい.
その第9弾としてテイラー展開を扱う.

テイラー展開

テイラー展開は,近似的に式の値を求めることによく用いられる数学的手法の1つである.以下に例を示す.※テイラー展開としているが,厳密にはマクローリン展開である.マクローリン展開については後述する.

例①:exp(x)

$e^x=1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+...+\frac{x^{k-1}}{(k-1)!}+\frac{k}{k!}+...$

例②:cos(x)

$cos(x)=1+\frac{x^2}{2!}+\frac{x^4}{4!}+\frac{x^6}{6!}+...$

実装

ここでは,$e^x (x\ge0)$と$e^x (x\le0)$と$cos(x)$を例に実装する.ここで,プログラムを組むにあたって,先ほどの式に説明を加える.次にそれを示す.

$e^x=1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+...+\frac{x^{k-1}}{(k-1)!}+\frac{k}{k!}+...$
$\ \ \ \ \ \ \ \ |------d------|$
$\ \ \ \ \ \ \ \ |-------s-------|$
$d$: $(k-1)$項までの和
$s$: $k$項までの和

この式は無限級数であるから,実際の計算においては,有限回で打ち切らなければならない.打ち切る条件は,$k-1$項までの和を$d$,$k$項までの和を$s$としたとき,$\frac{|s-d|}{|d|}<EPS$となったときである.
$|s-d|$を打ち切り誤差,$\frac{|s-d|}{|d|}$を相対打ち切り誤差という.$EPS$は許容範囲であり,必要な精度に応じて適当に設定する.

ここから,ソースコードとそのときの出力を示す.

ソースコード①:exp(x)
taylor.java
//2021/03/03
//@Yuya Shimizu
//-------------------------------
//*     テイラー展開(exp(x))  *
//-------------------------------

import java.awt.*;
import java.awt.event.*;

//パネルの設定
class taylor1_Panel extends Panel{
    double myexp(double x){
        final double ESP = 1e-08;           //許容誤差
        double s = 1.0, e = 1.0, d = 1.0;   //テイラー展開の初期値(初項)
        int k;

        for (k=1; k<=200; k++){
            d = s;          //(k-1)項までの和
            e = e*x/k;      //k番目の項
            s = s + e;      //k項までの和

            if (Math.abs(s - d) < ESP*Math.abs(d)){ //打ち切り誤差
                return s;   //k項までの和をテイラー展開値として出力
            }
        }
            return 0.0; //収束しないとき
        }

    //表示
    public void paint(Graphics g){
        double x;
        g.drawString("       x                myexp(x)                                         exp(x)", 0, 20);
        for (x=0; x<=40; x=x+10){
            g.drawString(""+x, 20, (int)x*2+40);
            g.drawString(""+myexp(x), 80, (int)x*2+40);
            g.drawString(""+Math.exp(x), 260, (int)x*2+40);
        }
    }
}


//フレームの設定
class taylor1_Frame extends Frame{
    public taylor1_Frame(){
        setSize(450, 200);//450×200の大きさでフレームを作成
        //×ボタンを押したら終了
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        Panel p = new taylor1_Panel();  //パネルオブジェクトpに先ほど設定したパネルを指定
        add(p); //フレームにそのパネルを貼り付け
    }
}


//クラス
public class taylor1{
    //メイン関数
    public static void main(String[] args){
        Frame w=new taylor1_Frame();
        w.show();
    }
}
出力

taylor1_exp(x).PNG

上記のプログラムでは,負の値に対応できない.

ソースコード②:exp(x)--負の値に対応
taylor2.java
//2021/03/03
//@Yuya Shimizu
//-------------------------------------------------------
//*     テイラー展開(exp(x)改良版): 負の場合にも対応   *
//-------------------------------------------------------

import java.awt.*;
import java.awt.event.*;

//パネルの設定
class taylor2_Panel extends Panel{
    double myexp(double x){
        final double ESP = 1e-08;           //許容誤差
        double s = 1.0, e = 1.0, d = 1.0, a;    //テイラー展開の初期値(初項)
        int k;

        a = Math.abs(x);
        for (k=1; k<=200; k++){
            d = s;          //(k-1)項までの和
            e = e*a/k;      //k番目の項
            s = s + e;      //k項までの和

            if (Math.abs(s - d) < ESP*Math.abs(d)); //打ち切り誤差
                if (x > 0)
                    return s;       //k項までの和をテイラー展開値として出力
                else
                    return 1.0/s;   //k項までの和が負値⇒逆数をテイラー展開値として出力
            }
            return 0.0; //収束しないとき
        }

    //表示
    public void paint(Graphics g){
        double x;
        g.drawString("       x                myexp(x)                                         exp(x)", 0, 20);
        for (x=-40; x<=40; x=x+10){
            g.drawString(""+x, 20, (int)(x+40)*2+40);
            g.drawString(""+myexp(x), 80, (int)(x+40)*2+40);
            g.drawString(""+Math.exp(x), 260, (int)(x+40)*2+40);
        }
    }
}


//フレームの設定
class taylor2_Frame extends Frame{
    public taylor2_Frame(){
        setSize(450, 250);//450×250の大きさでフレームを作成
        //×ボタンを押したら終了
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        Panel p = new taylor2_Panel();  //パネルオブジェクトpに先ほど設定したパネルを指定
        add(p); //フレームにそのパネルを貼り付け
    }
}


//クラス
public class taylor2{
    //メイン関数
    public static void main(String[] args){
        Frame w=new taylor2_Frame();
        w.show();
    }
}
出力

taylor2_exp(x).PNG

ソースコード③:cos(x)
taylor.java
//2021/03/03
//@Yuya Shimizu
//-------------------------------
//*     テイラー展開(cos(x))  *
//-------------------------------

import java.awt.*;
import java.awt.event.*;

//パネルの設定
class taylor3_Panel extends Panel{
    double mycos(double x){
        final double ESP = 1e-08;           //許容誤差
        double s = 1.0, e = 1.0, d = 1.0;   //テイラー展開の初期値(初項)
        int k;

        x = (x - (int)x + (int)x%360) * 3.1415927/180;  //xの値を0~2πに納める

        for (k=1; k<=200; k++){
            d = s;          //(k-1)項までの和
            e = -e*x*x/(k*(k+1));       //k番目の項
            s = s + e;      //k項までの和

            if (Math.abs(s - d) < ESP*Math.abs(d)); //打ち切り誤差
                return s;   //k項までの和をテイラー展開値として出力
            }
            return 9999.0; //収束しないとき
        }

    //表示
    public void paint(Graphics g){
        double x;
        g.drawString("       x                mycos(x)                                         cos(x)", 0, 20);
        for (x=0; x<=180; x=x+10){
            g.drawString(""+x, 20, (int)x*2+40);
            g.drawString(""+mycos(x), 80, (int)x*2+40);
            g.drawString(""+Math.cos(x*3.1415927/180), 260, (int)x*2+40);
        }
    }
}


//フレームの設定
class taylor3_Frame extends Frame{
    public taylor3_Frame(){
        setSize(450, 450);//450×450の大きさでフレームを作成
        //×ボタンを押したら終了
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        Panel p = new taylor3_Panel();  //パネル変数
        add(p);
    }
}


//クラス
public class taylor3{
    //メイン関数
    public static void main(String[] args){
        Frame w=new taylor3_Frame();
        w.show();
    }
}
出力

taylor3_cos(x).PNG

マクローリン展開

まず,$f(x)$の$x=a$におけるテイラー展開を示す.
$f(x)=f(a)+f'(a)\frac{x-a}{1!}+f''(a)\frac{(x-a)^2}{2!}+...$

$a=0$のときのテイラー展開を特にマクローリン展開という.つまり,マクローリン展開はテイラー展開の特殊な場合ということである.マクローリン展開の式を次に示す.
$f(x)=f(0)+f'(0)\frac{x}{1!}+f''(0)\frac{x^2}{2!}+...$

これで,上で示していた例は厳密にはマクローリン展開であることが理解できる.

桁落ち

例えば,有効桁数8桁で,$1234567.7+0.14556-1234567.9$という計算を考えてみる.
$1234567.7+0.1456\approx1234567.8$(有効桁数8)となり,真値($1234567.8456$)に対して大きな誤差はないが,$1234567.8-1234567.9=-0.1$となり,真値($-0.0544$)に対して,約50%もの誤差となる.
このように,上位の正しい桁が減算によりなくなった場合,それまで小さかった誤差が相対的に増大してしまう現象を桁落ちという.ここでは,はじめの2項を計算した時点で有効桁数に従い,無視した$0.0456$の部分が,3項目との計算時に上位の数字が減算によりなくなったことにより,相対的に大きくなったということである.

感想

テイラー展開とマクローリン展開の復習ができた.また,桁落ちについての理解も改めて深まった.

参考文献

Javaによるはじめてのアルゴリズム入門  河西 朝雄 著 技術評論社

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

プログラミング初心者が基礎基本を地道に身に着ける日記(Java_ABC191編)

※本稿はAtCoderProblemsのBeginnerContest,A~C問題をJavaを用いて地道に解いていく人間の観察日記です

目次

  • まえがき
  • AtCoder Beginner Contest 191に挑戦
    • A問題
    • B問題
    • C問題
  • 感想
  • お世話になったサイト(参考に使用)

まえがき

 前回の記事(ABC192)
~前回のあらすじ~
 中級者プログラマーの階段を一歩踏んだ(?)e2vee。今回は一時間で素早く終わらし、練習中であるイラスト作成に時間を割けるのか!頑張れe2vee~~!!

AtCoder Begginer Contest 191に挑戦

A問題

191A.java
import java.util.*;

class Main{
  public static void main(String args[]){
    Scanner sc = new Scanner(System.in);

    //入力した値を保存!
    int v = sc.nextInt();
    int t = sc.nextInt();
    int s = sc.nextInt();
    int d = sc.nextInt();

    //解
    String ans = "Yes";

    //情報を整理しよう
    //ボールがD[m]離れたときに消えているか判定する必要がある
    //ボールはT秒後~S秒後までの間、消えている

    //T秒時点の情報
    //ボールの位置は?
    int d_t = v * t;

    //S秒時点の情報
    //ボールの位置は?
    int d_s = v * s;

    //判定
    if(d_t <= d && d <= d_s){
      ans = "No";
    }

    //出力
    System.out.println(ans);
  }
}

 何も言うまい。今の私は無敵だ。

B問題

191B.java
import java.util.*;

class Main{
  public static void main(String args[]){
    Scanner sc = new Scanner(System.in);

    //入力した値を保存!(まずはN, Xのみ)
    int n = sc.nextInt();
    int x = sc.nextInt();

    //次は数列Aを一つずつXと比較
    //等しいなら削除(無視)
    //等しくないなら出力する
    for(int i=0; i<n; i++){
      //整数列Aを順番に保存
      int a = sc.nextInt();

      //等しくないか判定
      if(x != a){
        //順に出力
        System.out.print(a+" ");
      }
    }

  }
}

 EZな問題でしたが、わるい?クセで配列に格納後、一つずつ出力..的なことをしようとしてました。判定後、普通に一文字ずつ順に出力するだけでよかったのに..(笑)

 変なクセが抜けることを祈りつつ次へレッツゴォォオオ!(ここまで、15分程度経過)

C問題

191C.java
import java.util.*;

public class Main{
  public static void main(String args[]){
    Scanner sc = new Scanner(System.in);

    //入力した値を保存!H, Wのみ
    int h = sc.nextInt();
    int w = sc.nextInt();

    //区切りは""です..つまり一文字ずつですよ!
    //ということを入れておかないと一つの配列に全部(一行分)格納しちゃうハメに
    sc.useDelimiter("");

    //2次元配列の作成!
    String[][] a = new String[h][w];

    //"."なら白,"#"なら黒
    //行列!
    //これで二次元配列に情報を入れる
    for(int i=0; i<h; i++){
      for(int j=0; j<w; j++){

        //!!注意!! 改行の分を考えなきゃいけない
        String info = sc.next();
        if(info.equals("\n")){
          a[i][j] = sc.next();
        }else{
          a[i][j] = info;
        }


      }
    }

    /*公式解説
    辺の数 = 頂点の数ということ
    ある点(x, y)が頂点であること
    その点の周囲4マスのうち.の数が1or3であるということ(まちがって#と書いてるみたい)

    とりあえず頂点の数を数えようべ
    */

    //とりあえず答え用意
    int ans = 0;

    //2重forループで頂点を検索!
    for(int i=1; i<h; i++){
      for(int j=1; j<w; j++){

        //一個の頂点調べたらもういちど初期化しなきゃいけないからココで宣言
        //"."の数 WhiteCount
        int WC = 0;
        if(a[i][j].equals(".")) WC++;
        if(a[i][j-1].equals(".")) WC++;
        if(a[i-1][j].equals(".")) WC++;
        if(a[i-1][j-1].equals(".")) WC++;

        //ここで頂点かどうか判定
        if(WC==1 || WC==3){
          ans++;
        }
      }
    }

    //ans出力
    System.out.println(ans);

  }
}

 チーン⊂´⌒つ* -ω-)っ チーン⊂´⌒つ* -ω-)っ
 チーン⊂´⌒つ* -ω-)っ チーン⊂´⌒つ* -ω-)っ
 チーン⊂´⌒つ* -ω-)っ チーン⊂´⌒つ* -ω-)っ

 自分なりのアイデアを思い付いたのですが2重for文を2回使うし、上手くいかないしで、公式解説を参考にしました。

 頂点の数と辺の数一緒ですよね?

 グワァァアアアアアアアアアアアア!!!!!!!!
 そうでしたね..。

 加えてString型の文字列に演算子==を使うべきではないということをすっかり忘れてました。

 まだまだ伸びしろは銀河の果てまでありそうです..。

感想

 Bまではなんだかんだ書けますが、Cが鬼門ですね..。着実に思い出していきます..。

 変なアイデアのソースコードは下に貼り付けておきます..。供養というか、戒めと言うか。

191C.java
    /*没idea
    まずは横に走査
    - 白マスと黒マスが隣接している☆マスの数をカウントする
    - ただし、☆マスが隣接しているならカウント数をそれぞれ減らしていく
    縦も同じ


    int ans = 0;
    //横(辺:上下を確認)
    for(int i=1; i<h-1; i++){
      for(int j=1; j<w-1; j++){
        if(a[i-1][j]!=a[i][j]){
          ans++;
          if(a[i][j+1]=="#" || a[i][j-1]=="#"){
            ans--;
          }
        }
      }
    }

    //縦
    for(int i=1; i<w-1; i++){
      for(int j=1; j<h-1; j++){
        if(a[j][i-1]!=a[j][i]){
          ans++;
          if(a[j+1][i]=="#" || a[j-1][i]=="#"){
            ans--;
          }
        }
      }
    }
    */

お世話になったサイト

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

InvalidDefinitionException: No serializer found for class

事象 : InvalidDefinitionException: No serializer found for class

  • 環境
    • Windows10 Pro バージョン1909
    • Spring Tool Suite 4 Version: 4.7.2.RELEASE
    • java version "1.8.0_251"
    • spring-web 5.0.8
    • jackson-annotations 2.9.0
    • jackson-databind 2.9.6

APIのレスポンスのJSONをちゃんとBeanを定義しないでふわっとMapで受け取ろうとした。

@Service
public class HogeServiceImpl implements HogeService {

    @Override
    public HogeApiRes[] getData(HogeReq HogeReq) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<HogeApiRes[]> responseEntity = restTemplate.getForEntity("http://example.com/api", HogeApiRes[].class);
        return responseEntity.getBody();
    }
GetterとSetterはlombokの@Dataでいいや的な。
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

@Data
public class HogeApiRes {
    @JsonIgnore
    protected Map<String, Object> additionalProperties = new HashMap<String, Object>();
}

処理を動かしたら怒られた(クリックでConsoleのログ参照)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.sample.HogeApiRes and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.sample.HogeRes["responses"]->com.sample.HogeApiRes[0])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:312) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.std.ObjectArraySerializer.serializeContents(ObjectArraySerializer.java:249) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.std.ObjectArraySerializer.serialize(ObjectArraySerializer.java:210) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.std.ObjectArraySerializer.serialize(ObjectArraySerializer.java:22) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396) ~[jackson-databind-2.9.6.jar:2.9.6]
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:913) ~[jackson-databind-2.9.6.jar:2.9.6]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:288) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    ... 87 common frames omitted

原因 : 普通のGetterとSetterを使ってシリアライズできないから

参考

対応 : @JsonAnyGetter@JsonAnySetterを使う

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;

public class HogeApiRes {
    @JsonIgnore
    protected Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java で シェルソート[Shell Sort]

はじめに

最近プログラミングテストにハマっていて,ソートの問題があったのですが,
シェルソートに出会ったことがなかったので,まとめます.

シェルソート

シェルソート挿入ソートが改良されたアルゴリズムです.
挿入ソートでは,隣合う要素同士で比較・交換が行われますが,シェルソートはn個ずつ離れた要素同士で比較・交換を行います.
n個離れた要素を整列する処理をn-ソートと言います.
シェルソートはnの値を段々と小さくして行き,最終的に n=1 となるまで比較・交換を繰り返します. n=1 となった時はほとんど整列が行われている状態で挿入ソートが行われるので,整列が可能となります.

コード

今回は n = 4 とします.

Main.java
import java.util.*;
import java.io.*;


public class Main {
    // Main
    public static void main(String[] args) throws Exception {
        int[] numbers = new int[100];
        Random rand = new Random();

        // ソート前の表示
        System.out.println("ソート前");
        for(int i = 0; i < numbers.length; i++) {
            numbers[i] = rand.nextInt(5);
            System.out.print(numbers[i] + " ");
        }

        shellSort(numbers); // シェルソートの実行

        // ソート後の表示
        System.out.println("\nソート後");
        for(int i = 0; i < numbers.length; i++) {
            System.out.print(numbers[i] + " ");
        }
    }

    // シェルソート
    public static void shellSort(int[] numbers) throws Exception {
        int n = 4; // n-ソート
        int tmp; // 配列交換で一時的に保存する領域
        while (n > 0) {
            for (int i = 0; i < numbers.length; i++) {
                int j = i;
                tmp = numbers[i]; // 入れ替え元の配列の中身の保存
                // n-ソートを行う為にindex番号を進める また n個前の配列と比較して交換の必要があったら交換する.
                while ((j >= n) && (numbers[j-n] > tmp)) {
                    numbers[j] = numbers[j - n];
                    j = j - n; // n個 ずつ確認をするための処理
                }
                numbers[j] = tmp; // 最後に更新された配列の中身に,入れ替え元を入れる.
            }
            n -= 1; // n の更新
         }
    }
}
入力
171 269 25 57 57 18 291 273 14 118 292 170 90 129 162 203 233 121 267 81 246 33 259 165 154 104 27 94 57 167 287 260 288 133 165 9 92 105 122 199 195 199 111 195 161 100 193 4 188 140 109 101 1 78 244 205 263 127 22 69 258 293 270 99 191 219 182 150 99 13 293 102 134 110 288 47 9 294 85 91 299 87 79 232 117 168 10 245 293 47 154 119 170 96 232 48 259 103 185 264 
出力
1 4 9 9 10 13 14 18 22 25 27 33 47 47 48 57 57 57 69 78 79 81 85 87 90 91 92 94 96 99 99 100 101 102 103 104 105 109 110 111 117 118 119 121 122 127 129 133 134 140 150 154 154 161 162 165 165 167 168 170 170 171 182 185 188 191 193 195 195 199 199 203 205 219 232 232 233 244 245 246 258 259 259 260 263 264 267 269 270 273 287 288 288 291 292 293 293 293 294 299

終わりに

n によって処理速度は変わりますが,以上のコードでソートはできていそうです.
テストは行っていないので,行い次第更新したいと思います!!!

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

Android Studio 電卓アプリ制作

出来るだけコードが少なくなるように電卓アプリを作成しました。
改善点などご教授いただけますと幸いです。
YouTubeに作っている動画をアップしています。
https://www.youtube.com/watch?v=kvz7gLP3SHI&list=PLhg2PHSq8bjisIZGg-cLe4TegqJTCBXhS

strings.xml
<resources>
    <string name="app_name">CalculateApp</string>
    <string name="btn_zero">0</string>
    <string name="btn_one">1</string>
    <string name="btn_two">2</string>
    <string name="btn_three">3</string>
    <string name="btn_four">4</string>
    <string name="btn_five">5</string>
    <string name="btn_six">6</string>
    <string name="btn_seven">7</string>
    <string name="btn_eight">8</string>
    <string name="btn_nine">9</string>
    <string name="btn_plus">+</string>
    <string name="btn_minus">-</string>
    <string name="btn_times">×</string>
    <string name="btn_divide">÷</string>
    <string name="btn_clear">C</string>
    <string name="btn_point">.</string>
    <string name="btn_equal">=</string>
</resources>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="7"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text_formula"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="right"
        android:textSize="36sp"></TextView>

    <TextView
        android:id="@+id/text_result"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="right"
        android:textSize="36sp"
        android:textStyle="bold"></TextView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="4">

        <Space
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"></Space>

        <Space
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"></Space>

        <Space
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"></Space>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_clear"
            android:onClick="tapClear"
            android:textSize="36sp"></Button>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="4">

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_seven"
            android:onClick="tapSeven"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_eight"
            android:onClick="tapEight"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_nine"
            android:onClick="tapNine"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_divide"
            android:onClick="tapDivide"
            android:textSize="36sp"></Button>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="4">

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_four"
            android:onClick="tapFour"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_five"
            android:onClick="tapFive"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_six"
            android:onClick="tapSix"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_times"
            android:onClick="tapTimes"
            android:textSize="36sp"></Button>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="4">

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_one"
            android:onClick="tapOne"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_two"
            android:onClick="tapTwo"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_three"
            android:onClick="tapThree"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_minus"
            android:onClick="tapMinus"
            android:textSize="36sp"></Button>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="4">

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_zero"
            android:onClick="tapZero"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_point"
            android:onClick="tapPoint"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_equal"
            android:onClick="tapEqual"
            android:textSize="36sp"></Button>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:layout_weight="1"
            android:text="@string/btn_plus"
            android:onClick="tapPlus"
            android:textSize="36sp"></Button>
    </LinearLayout>

</LinearLayout>
MainActivity.java
package com.example.calculateapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    TextView formula, result;
    List<String> symbols;

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

        formula = findViewById(R.id.text_formula);
        result = findViewById(R.id.text_result);
        symbols = new ArrayList<String>();
    }

    public void tapZero(View view) {
        formula.setText(formula.getText().toString() + "0");
    }

    public void tapOne(View view) {
        formula.setText(formula.getText().toString() + "1");
    }

    public void tapTwo(View view) {
        formula.setText(formula.getText().toString() + "2");
    }

    public void tapThree(View view) {
        formula.setText(formula.getText().toString() + "3");
    }

    public void tapFour(View view) {
        formula.setText(formula.getText().toString() + "4");
    }

    public void tapFive(View view) {
        formula.setText(formula.getText().toString() + "5");
    }

    public void tapSix(View view) {
        formula.setText(formula.getText().toString() + "6");
    }

    public void tapSeven(View view) {
        formula.setText(formula.getText().toString() + "7");
    }

    public void tapEight(View view) {
        formula.setText(formula.getText().toString() + "8");
    }

    public void tapNine(View view) {
        formula.setText(formula.getText().toString() + "9");
    }

    public void tapPoint(View view) {
        formula.setText(formula.getText().toString() + ".");
    }

    public void tapPlus(View view) {
        formula.setText(formula.getText().toString() + "+");
        symbols.add("+");
    }

    public void tapMinus(View view) {
        formula.setText(formula.getText().toString() + "-");
        symbols.add("-");
    }

    public void tapTimes(View view) {
        formula.setText(formula.getText().toString() + "×");
        symbols.add("×");
    }

    public void tapDivide(View view) {
        formula.setText(formula.getText().toString() + "÷");
        symbols.add("÷");
    }

    public void tapClear(View view) {
        formula.setText("");
        result.setText("");
        symbols.clear();
    }

    public void tapEqual(View view) {
        BigDecimal tmp;
        BigDecimal numResult = new BigDecimal(0);
        String TextFormula = formula.getText().toString();
        List<String> nums = Arrays.asList(TextFormula.split("[\\+\\-×÷]", -1));
        List<BigDecimal> numbers = new ArrayList<BigDecimal>();
        try {
            if ((nums.get(0).length() == 0) && (symbols.get(0) == "-")) {
                nums.set(0, "0");
            }
            for (String num : nums){
                numbers.add(new BigDecimal(num));
            }
            for (int i = 0; i < symbols.size(); i++) {
                switch (symbols.get(i)) {
                    case "×":
                        tmp = numbers.get(i).multiply(numbers.get(i+1));
                        numbers.set(i,new BigDecimal(0));
                        numbers.set(i + 1, tmp);
                        break;
                    case "÷":
                        tmp = numbers.get(i).divide(numbers.get(i+1),2,BigDecimal.ROUND_HALF_UP);
                        numbers.set(i,new BigDecimal(0));
                        numbers.set(i + 1, tmp);
                        break;
                    case "-":
                        numbers.set(i+1,numbers.get(i+1).multiply(new BigDecimal(-1)));
                        break;
                }
            }
            for (BigDecimal num : numbers) {
                numResult = numResult.add(num);
            }
            result.setText(numResult.toString());
        } catch (Exception e) {
            Log.e("エラー", e.getMessage());
        }
    }
}

縦画面に固定したいので、マニフェストに追記

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.calculateapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.CalculateApp">
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">//縦画面固定
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

YouTubeに作っている動画をアップしています。
https://www.youtube.com/watch?v=kvz7gLP3SHI&list=PLhg2PHSq8bjisIZGg-cLe4TegqJTCBXhS
以上。

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

[うまくいかなかった]Listの中身が表示されない問題

状況

1.top.jsp
2.TestServlet
3.test.jsp ←イマココ
4.TestResultServlet
5.testResult.jsp
6.top.jsp

配列を用意してsetAttributeでServletで渡ってるはずなのに、リストデータを取得した以下の文の中身がJSPに表示されない。

//test.jsp

//リストデータをリクエストから取得
List<QuestionsBean> qlist = (List<QuestionsBean>)request.getAttribute("qlist");

    //questionのデータが空でない場合
    if(qlist != null){

        //qestionのデータの数分、繰り返し処理
        for(int i=0;i<qlist.size();i++){
%>

<div class="inputQuestion">
    <p>
        <!-- 問題番号 -->
        <input readonly type="text" name="questionId" value="<%= qlist.get(i).getId() %>">
    </p>
    <p>
        <!-- 問題 -->
        <textarea readonly name="question"><%= qlist.get(i).getQuestion() %></textarea>
    </p>
</div>

<!-- 回答 -->
<div class="input-answer">
<p> 回答:
    <!-- 答え -->
        <input type="text" name="answer" id="answer">
</p>
</div>
<%
    }
}
%

原因

①サーブレットの遷移先が間違っていた:baby_tone1:

//TestServlet.java

RequestDispatcher rd = request.getRequestDispatcher("list.jsp");
            rd.forward(request, response);

コピペマンのあるある。
そのせいでサーブレットからデータが渡ってきてなかった

②postに渡したいのにaタグで書いてた

//top.jsp
誤 <a href="TestServlet">テストをする</a>
//top.jsp
正 <form action="TestServlet" method="post">
        <input type="submit" value="テストをする">
    </form>

まとめ

遷移先のミスは想定外でした。。
2回目のミスなので備忘録:boy_tone1:

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

Eclipseのgitconfigのパスが変更できない

問題

Eclipseのgitconfigのパスが変更できない

[設定]-[チーム]-[Git]-[構成]-[レポジトリ設定] 
[設定]-[チーム]-[Git]-[構成]-[ユーザー設定]

にあるロケーションに設定されているパスが以下の値から変更できない

W:¥.gitcofig (non-writable)

解決策

コマンドプロンプトで

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

 Java   Excel ピボットテーブルを作成

ピボットテーブルは表計算ソフトまたはビジネスインテリジェンスソフトウェアにて利用されるデータ可視化要約機能である。今日は Spire.XLS for Javaを使ってExcelでピボットテーブルを作成する方法を紹介します。

下準備

1.E-iceblueの公式サイトからFree Spire. XLS for Java無料版をダウンロードしてください。

f:id:lendoris:20210303151514p:plain 

2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。

f:id:lendoris:20210303151547p:plain


import com.spire.xls.*;

public class CreatePivotTable {
    public static void main(String[] args)  {


        Workbook workbook = new Workbook();
        workbook.loadFromFile("Sample.xlsx");

        Worksheet sheet = workbook.getWorksheets().get(0);

        //キャッシュを作成します。
     
        CellRange dataRange = sheet.getCellRange("A1:C19");
        PivotCache cache = workbook.getPivotCaches().add(dataRange);

        //キャッシュを使ってピボットテーブルして、テーブルの名前と位置を指定します。
        PivotTable pt = sheet.getPivotTables().add("Pivot Table", sheet.getCellRange("E10"), cache);

        // Rowを追加します。
        PivotField pf=null;
        if (pt.getPivotFields().get("Name") instanceof PivotField){
            pf= (PivotField) pt.getPivotFields().get("Name");
        }
        pf.setAxis(AxisTypes.Row);

        PivotField pf2 =null;
        if (pt.getPivotFields().get("Area") instanceof PivotField){
            pf2= (PivotField) pt.getPivotFields().get("Area");
        }
        pf2.setAxis(AxisTypes.Row);

        //值を追加します。
        pt.getDataFields().add(pt.getPivotFields().get("Population"), "SUM of Count", SubtotalTypes.Sum);

        //ピボットテーブルを書式設定します。
        pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleMedium12);

        //保存します。
        workbook.saveToFile("output/CreatePivotTable.xlsx", ExcelVersion.Version2013);
    }

実行結果

f:id:lendoris:20210303151624p:plain

 

 

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

Java  PDFにフォントを埋め込む

Spire.PDF for Javaでは「標準フォント」「TrueTypeフォント」及び「CJKフォント」が適用できます。今回はPDFにこれらのフォントを埋め込む方法を紹介します。

下準備

1.E-iceblueの公式サイトからFree Spire.PDF for Java無料版をダウンロードしてください。

f:id:lendoris:20210303150658p:plain

2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.PDF.jarを参照に追加してください。

f:id:lendoris:20210303150712p:plain

import com.spire.pdf.graphics.*;

public class PdfFonts {

    public static void main(String[] args) {

        //PdfDocument objectを作成します。
        PdfDocument doc = new PdfDocument();

        //ページ一つを追加します。
        PdfPageBase page = doc.getPages().add();

        // ブラッシュを作成します。
        PdfBrush brush = PdfBrushes.getBlack();

        //Yを初期化します。 
        float y = 30;

        // 標準のフォントでテキストを書きます。
        PdfFont standardFont = new PdfFont(PdfFontFamily.Helvetica, 14f);
        page.getCanvas().drawString("Standard Font - Helvetica", standardFont, brush, 0, y);
        standardFont = new PdfFont(PdfFontFamily.Times_Roman, 14f);
        page.getCanvas().drawString("Standard Font - Times_Roman", standardFont, brush, 0, (y = y + 16));
        standardFont = new PdfFont(PdfFontFamily.Courier, 14f);
        page.getCanvas().drawString("Standard Font - Courier", standardFont, brush, 0, (y = y + 16));

        //true typeフォントでテキストを書きます。
        java.awt.Font font = new java.awt.Font("Arial", java.awt.Font.BOLD, 14);
        PdfTrueTypeFont trueTypeFont = new PdfTrueTypeFont(font);
        page.getCanvas().drawString("TrueType Font - Arial", trueTypeFont, brush, 0, (y = y + 30f));

        //プライベートフォントででテキストを書きます。


        String fontFileName = "C:\\Users\\Administrator\\Desktop\\Khadija.ttf";
        trueTypeFont = new PdfTrueTypeFont(fontFileName, 14f);
        page.getCanvas().drawString("Private Font - Khadija", trueTypeFont, brush, 0, (y = y + 30f));

        //cjkでテキストを書きます。

        PdfCjkStandardFont cjkFont = new PdfCjkStandardFont(PdfCjkFontFamily.Monotype_Hei_Medium, 14f);
        page.getCanvas().drawString("How to say 'Font' in Chinese? \u5B57\u4F53", cjkFont, brush, 0, (y = y + 30f));
        cjkFont = new PdfCjkStandardFont(PdfCjkFontFamily.Hanyang_Systems_Gothic_Medium, 14f);
        page.getCanvas().drawString("How to say 'Font' in Japanese? \u30D5\u30A9\u30F3\u30C8", cjkFont, brush, 0, (y = y + 16f));
        cjkFont = new PdfCjkStandardFont(PdfCjkFontFamily.Hanyang_Systems_Shin_Myeong_Jo_Medium, 14f);
        page.getCanvas().drawString("How to say 'Font' in Korean? \uAE00\uAF34", cjkFont, brush, 0, (y = y + 16f));

        //保存します。
        doc.saveToFile("Fonts.pdf");
        doc.close();
    }
}

実行結果

f:id:lendoris:20210303150757p:plain

 

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

カフェでプログラミングしてる風(でも何もやってない)Java(クソ)コード

おしゃれなカフェで...

私はエンジニア。
コーヒー片手にMacでプログラミングしています。
今日はどんな素晴らしいアート(プログラム)が生まれるかしら?♪

的な事を演出したいときって、誰にだってありますよね?

今日は、カフェでMacを使っている時に周りから
「お、この人Macで何かやってるな。何か難しそうな事をしているからエンジニアなんだな。素敵だな。」
と思わせる素敵な(Kuso)プログラムを用意しました。

ぜひ、おしゃれカフェで使ってみてください。

ターミナルで実行すればカッコイイJavaコード2つ

ステータスが変化してる風コード

まずは、何か処理が動いているように見せるコードがこちら!

DungStatusChange.java
/**
 * ステータスを更新してる風コード
 */
public class DungStatusChange {
  public static void main(String[] args) {
    // 50文字まで#を表示する
    int x = 50;
    // カウントアップする変数
    int y = 0;
    while (true) {
      if (x != y) {
        // 上限まで#を足していく
        System.out.print("#");
      } else {
        // 50文字になったら「 done!! + 改行」を出力し
        // 何かが終わった感を演出
        System.out.println(" done!!");
        // カウントアップをリセット
        y = -1;
      }
      // カウントアップしていく
      y++;
      // 高速で出力すると素敵感が出ないので
      // 出力待ち時間を作成する
      int sleepTime = 10;
      // ランダム値にマッチすると待ち時間をさらに長くする。
      // 何か大きな処理をしているように見えること請け合い
      int osooso = (int)(Math.random() * 10);
      if (4 < osooso  && osooso <= 6) {
        sleepTime = 100;
      }
      try {
        // 待つ
        Thread.sleep(sleepTime);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

これを実行したものがこちら!
DungStatusChange.gif

どうですか、この何かしている感!!笑
こりゃきっと何かしてますね!!笑

コンパイルが動いている風コード

そして、何かを自動で作っている感を演出するコードがこちら!

DungCompiler.java
/**
 * 数字の羅列を出力し、何かを自動で作ってる風コード
 */
public class DungCompiler {
  public static void main(String[] args) {
    while (true) {
      // カウントアップ
      int x = 1;
      // 出力文字列
      String code = "";
      while(true) {
        // 0から9までの数値をランダムで出力
        int num = (int)(Math.random() * 9);
        // 出力文字列に足していく
        code += String.valueOf(num);
        if (x == 50) {
          // 50文字でブレイク
          break;
        }
        x++;
      }
      // 数値の羅列を出力:いい感じにコンパイルしてる感が出る
      System.out.println(code);
      // 高速で出力すると素敵感が出ないので
      // 出力待ち時間を作成する
      int random = (int)(Math.random() * 10);
      int sleepTime = 100;
      // ランダム値にマッチすると待ち時間をさらに長くする。
      // 何か大きな処理をしているように見えること請け合い
      if (4 < random  && random <= 6) {
        sleepTime = 500;
      }
      try {
        // 待つ
        Thread.sleep(sleepTime);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

動かすとこんな感じ!
DungCompiler.gif

どうですか、これは確実に何かを自動で作っていますね!!
ヘタすりゃ、スカウトされますよ!!

さらにこれらのコードを2つ同時に起動しておくと完璧です。
cap01.gif

ね?完璧でしょ!?笑
よ!!マルチタスク人間!!笑

これでちょっとイイ感じのスーツ着て、髪の毛をナチュラルにキメて
片手にコーヒー、片手にiPhoneで、ちょっと考えてるフリすりゃもうデキる人間にしか見えないでしょ?!
写真撮ってsnsにアップすればより多くの満足感が得られますね!

自己肯定感爆上げですわ!!

ついつい。。。

夜中に酒飲んで勢いで作っちゃいました。笑
動画の撮り方もよくわからずグズグズしてますね。苦笑
これを恥ずかしげもなくカフェに持ち込めればテンションが上がるはず。
自己演出は結構テンションが上がりますね。

一応Kusoコードgithubに上げたんで好きに使ってください。

ありがとうございました。

すいません。少し宣伝させてください!

こんなに反響をいただけるとは。。。
皆さん本当にありがとうございます!

すいませんが少し宣伝させてください。

こんな感じのLINEスタンプを現在販売中です。
『たまご家族』っていいます。



よろしければ買ってください!

あと、以下サービスやってます。
個人開発は始めたばかりなので、不出来な所もあるかもしれませんが、よろしければ。

chocopoi
twitterの気になる人に、ひそかに、誰にも知られず、choco(≒いいね)を送るサービス
誰かを陰ながら応援できます。
ホントのチョコじゃないですよ。

だいごったー
略語ツイート(だいご:代語と言います)を作成するサービス

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

Java のマルチスレッド備忘録

スレッドの状態

Thread.State に定義されている

状態 説明
NEW 起動していないスレッドの状態
RUNNABLE Java 仮想マシンで実行されているスレッドの状態
BLOCKED ブロックされ、モニターロックを待機しているスレッドの状態
WAITING ほかのスレッドが特定のアクションを実行するのを無期限に待機しているスレッドの状態
TIMED_WAITING 指定された待機時間、ほかのスレッドがアクションを実行するのを待機しているスレッドの状態
TERMINATED 終了したスレッドの状態
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む