Javaでジャバジャバ

プログラミングの問題をJavaで解いたのでその備忘録的な何か。

HashMapをValueで並び替える

正確にはHashMapを並び替えるのではなくそのkeyを並べる的な。
手っ取り早くてわかりやすかったのがkeyのlistを作ってそいつを並び替える。

import java.util.*;

HashMap<String,Data> datas = new HashMap<>();
ArrayList<String> names = new ArrayList<>(datas.keySet());
name.sort((e1,e2)->{
    return Integer.compare(datas.get(e1).value,datas.get(e2));
});

上は大分簡略化してある。最後にちゃんとしたやつを載せる予定。

if文と三項演算子について

三項演算子で書いたら入れ子になりすぎてわからなくなった(泣)

            if(d.curRan==d.lastRan){
                d.rank="same";
            }else if(d.lastRan>disNum){
                d.rank="new";
            }else if(d.lastRan<=disNum && d.curRan<d.lastRan){
                d.rank="up";
            }else if(d.lastRan<=disNum && d.curRan>d.lastRan){
                d.rank="down";
}

これは

     (d.lastRan==d.lastRan?"same":(d.lastRan>disNum?"new":(d.curRan<d.lastRan?"up":"down")))

で直接出力の部分に書けるけど上の方が圧倒的に読みやすい気がする。コードが短いのは下だけど、一発で書けるのはまだまだかなぁ。さすがに上のやつを見ながらはかけるけど。

static 内部クラスについて。

Javaをこういうので初めて使ったのであれだけど内部クラスとしてインスタンス化するにはstatic使わなあかんみたい。これちょっとあれって思ったんだけど、確かにインスタンスごとに必要なものではないなぁと納得した。あと、普通のクラス作成についてだけど、toStringとかhashcodeとか省略した。それはなくてもいけるので。あ~でも、HashMapに自分で作ったクラスをキーとして登録するときはちゃんとequalsも定義しなきゃねってのを思い出した。

修飾子について

これは全然気にしてない。再利用とか考えてないし。最近読んでるのがそういう本なんだけれど、ちっとも生かされてないね、しょうがないね。

ええ...で、これが何のプログラムに使ったのかというと

先月のジョギング記録と今月のジョギング記録からジョギングランキングを作って先月比new up down sameをつけて表示しろっていうプログラム。
入力は
N M T
NAME_1 LAST_RECORD_1
・ ・ ・ ・
NAME_N LAST_RECORD_N
DAY_1 NAME_1 THIS_RECORD_1
・ ・ ・ ・
DAY_M NAME_M THIS_RECORD_M
っていう感じで改行区切りの入力になってる。Nは先月のジョギングした人の総数。直後にN行続くことを示してる。Mは今月のレコードの数でN行の下に続いて現れる行の数。N行の内には名前の重複はないけど、M行には名前の重複があり、NAMEが1回で走った距離がTHIS_RECORDに書かれてる。っていう仕様だったかな。そんな問題に出会ったら僕の失敗を糧にして強く生きてくださいというメッセージでした。嘘です。
答えというかソースgithubに上げたので見てってやってください。
https://github.com/b1u3-YumaNoguchi/daily-program/blob/master/java/A2017_2_17.java

近況

前に買ったSF アンドロイドは電気羊の夢を見るか っていう本読んでる。まだまだおもしろくなりそうな予感あるし、楽しみ。
そういや前のブログ更新してそんな経ってないな。まぁ、その前が空いてたし書きたいときに書ければいいか。