次javaのマップマップとはjavaのマップはユニークな(重複できない)キーに対して値を対応させるものです。キーと値は作成時にそれぞれクラスを指定します。LinkedHashMap<>();MapとLinkedHashMapの関係はListとLinkedListの関係と同じです。宣言は<>の中に入れるkeyとvalueのクラスをそれぞれ宣言します。後ろの<>はこのように省略できます。相当するラッパークラスで宣言します。自作のクラスや、配列やリストも使えます。整数と整数からなるリストを使う場合は次のようになります。LinkedHashMap<>();javascriptの連想配列では、キーは文字列のみ、値の方には様々な型の変数やオブジェクトを混ぜて格納できましたが、javaでは宣言時にクラスを限定します。Objectを指定して、混ぜてしまうことも不可能ではありませんが、普通はやりません。エントリーの追加と更新・参照キーと値の組をエントリーといいます。宣言の後、追加して格納します。peach=もも}put()は要素の追加ですが、同一のkeyが既にあればvalueを上書きします。参照はget(key)で行います。Mapの場合は、配列やリストではそのまま:の後ろに書きましたが、Mapでは、キーを使う方法と値を使う方法、両方をセットにしたentryを使う方法から選べます。3ついっぺんに使ってみます。Value:もも:の前に書くインスタンスのクラスはMapの要素により決まります。entrySet()forEachメソッドで繰り返しJava8から使用できるメソッドです。Value:もも連想配列に感動した昔javascript版と同じ企画です。連想配列に出会ったのは1993年のことでした。UNIX上のawkでした。次のような名前と数値が組になったデータから、名前ごとの合計を出すというものです。98こんな感じでできてしまいます。$1がキー、$2が値でキーが同じ場所に値を加算するものです。awkではデータはファイルですが、javascriptでは別ファイルにするのは無理があるのでプログラム中に書き込みました。Javaではファイルから読む方法に戻します。Files.readAllLines()を使ってみます。スペース区切りのテキストファイル。いう名前でプログラムを実行するディレクトリに置きます。397処理がわかりやすいように冗長に分けて記述しています。相当するキーがないとき、戻値はnullですが、これを第二引数の0にするメソッドです。2>tmp.lengthはデータファイルに空行が入ってしまった時に面倒なので入れてあります。Map#merge()を使ってやってみるDebianのパッケージのJavaを使ってきた関係で、最近やっとversion1.8を使うようになりました。11が出たというのに遅いですが、そう急ぐ必要もありません。今回.getOrDefault()の他にMapにいろいろなメソッドが追加されていることを知り、ちょっと調べてみました。今回の用途ではcompute()関係かなと思っていたのですが、merge()メソッドも使えます。名前から複数のMapの合成をイメージしてしまうのですが、これが邪魔をしていました。397getOrDefault()と比べて長さとしてはあまり違いはありませんが、ちょっとわかりづらい。mergeは引数を3つとります。引数:keyマージするキーです。mapにこれが存在するかをまず調べます。存在すれば、第二引数が使われ、しなければ第三引数が使われます。3項演算子にも似ています第二引数:Integer.parseInt(tmp[1])keyが見つからない時に値として保存したいものです。今回入れた式はファイルから切り出した値を整数化したものです。val+tmp1格納する値を計算する部分です。名前のない関数と捉えるとわかりやすいかもしれません。tmp1)が関数の仮引数で、->の後ろが関数の内部です。}を書いて複数の文から構成し、return文で値を戻すことも可能です。仮引数のvalはkeyが存在した時に対応している値です。tmp1は第二引数の値です。Javaの仮引数には変数の型を書きますが、ここでは推論してくれますから不要です。tmp1の場所に書かれる値の理解がポイントです。普通はkeyが見つからないという例外のために設定した値を、メイン部分で使うという発想をしないからです。Map#compute()を使ってやってみるcompute()も使ってみます。2つめの(k,v)は今度は第一引数のkeyと、それに対応する値のvです。keyがなければvはnullになります。->の後の関数はvがnullかどうかでどちらかの値を返す3項演算子になっています。397getOrDefault(),merge(),compute()の比較getOrDefault()を使った場合と、merge()、compute()を使った場合を並べてみました。);今回の目的にはmerge()を使った方がわかりやすいとは言えない気がしますが、valueの値を一度書けばよいのはメリットかもしれません。merge(),compute()は、C言語やJava7まででは見慣れないのですが、Java8の拡張の目玉であるラムダ式に絡んだものなので、慣れると応用範囲が広がるのかもしれません。存在関連のメソッドgetOrDefault(),merge(),compute()などが出て、containsKey()を使う機会が出てきませんでした。その他も使用頻度は低そうです。clear()全部の要素を削除。isEmpty()要素を持たなければtrue。key)指定したキーの要素があればtrue。value)指定した値の要素が一つでもあればtrue。合致する要素は複数あるかもしれない。置換・削除関連のメソッドJava8で随分と新しいメソッドが増えていて、追加と置換を分けて行うことができるようになっています。上記の「エントリーの追加と更新・参照」を書いた時はreplace()が追加されていることを知りませんでした。trueKeyによる並べ替えここでは、数値の場合の大きさの順や文字列の文字コード順などデフォルトで設定されているような、単純なものについてやってみます。いう言葉は出てきますが、きちんと説明している箇所を見つけられないでいます。HashMapは登録の順序が保存されないので、その分処理が早くなると期待できます。登録の順を保持したければLinkedHashMapを使います。これは、put時に二分木を使っておいて、拡張for文やforEach()メソッドで出す時に順番になるようにするものです。後からある種のメソッドで並び替えるというものではありません。TreeMapを使うときには、SortedMap<K,V>インターフェースで宣言すると機能が増えますが、拡張for文やforEach()メソッドで使うだけならMapでかまいません。それぞれ生成するように書き換えて試すようになっています。現在の状態はTreeMapです。データは文字列でASCIIの範囲ですが、ひとつだけ大文字で始まるものがあります。"自然順序付け"です。}}実行結果まず、LinkedHashMapです。プログラム中の登録順そのままです。Value:黒HashMapです。キーを探しやすいようにHashというものを作って格納しますが、コンピュータが探しやすいという都合で取り出す時の順番が変わってしまいます。Value:黒TreeMapです。そもそも登録の時に大きさの順で格納位置を探しながら格納します。HashでなくTreeという手法を使っているのです。知っている人は名前から性質を知ることができます。文字列の順番は文字コード順が一番簡単です。大文字が小さな文字コードに割り当てられているのでこのようになります。大文字小文字を同一視する方法もあります。TreeMap<>(String.CASE_INSENSITIVE_ORDER);ただし、Peachとpeachを同一視するので、キーは先に登録される「peach」になり、値は後から登録される「桃」になって要素数は9になってしまいます。同一視してもキーがユニークになる場合に使うのがいいでしょう。ない場合は、区別したままMapを作り、keySet()やentrySet()などでキーを取り出してから別な方法でソートする方法が使えると思います。TreeMap<>(String.CASE_INSENSITIVE_ORDER.reversed());ソートはいろいろな方法があって、もっと複雑な指定もできます。1.8になって楽になったようですので、古い方法を苦労して覚えなくてもいいでしょう。安達順一(2018-12-24)https://dabiyone.com/。