LinkedHashMap<Integer, Integer> map = ... for (int key : map.keySet()) { System.out.println("Value: " + map.get(key)); } for (int value : map.values()) { System.out.println("Value: " + value); } for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println("Key: " + entry.getKey() ); System.out.println("Value: " + entry.getValue()); }
TreeMapはputするだけでkeyの順に並べてくれるが、Mapなのでkeyはユニークでなければならない
順位は同順である可能性もある。
成績順の印刷のためにnjun(n)に名簿番号nの生徒の順位が入っている。これをソートしなければならない。(まあ、1を捜して印刷し2を捜して印刷し...でもできないことはないが)
TreeMapを使えば追加と同時にソートされるが、同じ値はひとつになってしまうはず。そこで、
TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>(); for(int n=1;nmax>=n;n++){ map.put(njun[n]*100+n, n); }
順位を100倍して名簿番号を加えたものをキーにする。
インスタンスは次のようにすれば良いとの記述もあるが、積極的な理由がないので採用しない。
Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
値の取り出し方。メソッドで得られるものはSetとCollectionの違いがあるが、拡張forに使え、どれもkeyの順番に取り出せる。
public Set<K> keySet() public Collection<V> values() //(コレクションのイテレータは、値を対応するキーの昇順で返します。) public Set<Map.Entry<K,V>> entrySet()
TreeMapはputするだけでkeyの順に並べてくれるが、逆順も可能だ。
TreeMap<Double, Integer> map = new TreeMap<>(Collections.reverseOrder());
Java7以降では、コンストラクタの型変数を省略できるというので<>と言うのが使える。つまり、
TreeMap<String,double[]> avgmap= new TreeMap<>();
と書ける
listやmapでは格納するものをクラスで限定する。これは1.5で導入された。intやdoubleでなく、IntegerやDoubleを指定しなければならない
色々調べるにはジェネリクス(総称型)で検索するとヒットする。型の限定は一部の機能なのだが、これが一番身近。限定しようとするのに総称というのはしっくり来ないが、Javaの歴史的な事情によるものだろう。
とにかく、intやdoubleでは次のようにコンパイルが通らない
test/MapTest.java:19: エラー: 予期しない型 TreeMap<String,double> pdmap= new TreeMap<String,double>(); ^ 期待値: 参照 検出値: double
次のようにすればよい
TreeMap<String,Double> map = new TreeMap<String,Double>();
エラーの説明にある参照というのがポイントだろう。
ところが、Valueとしてdoubleの配列を使いたい時に、うっかりDouble[]としてエラーを出した。
TreeMap<String,Double[]> avgmap= new TreeMap<String,Double[]>(); コンパイルでエラーとなる。 $ javac gakuj/GakuJun.java gakuj/GakuJun.java:327: エラー: putに適切なメソッドが見つかりません(String,double[]) avgmap.put(hr,avg); ^ メソッド TreeMap.put(String,Double[])は使用できません (実引数double[]はメソッド呼出変換によってDouble[]に変換できません) メソッド AbstractMap.put(String,Double[])は使用できません (実引数double[]はメソッド呼出変換によってDouble[]に変換できません) エラー1個
Double[]が使えないということではなく、putしようとした配列が、Double[]でなくdouble[]であったということ。
指定をdouble[]にすれば受け付ける。
TreeMap<String,double[]> avgmap= new TreeMap<String,double[]>();
もちろんputする配列をDouble[]の配列にしてもよい。参照になっていればいいのだ。
Doubleのインスタンスなどしばらく作っていなかったので、Double[]をつくってみたものの入れるDoubleを作る方法をほとんど忘れていた。いろいろ試してみる。
TreeMap<String,Double[]> avgmap= new TreeMap<String,Double[]>(); Double[] avg = new Double[4]; avg[0] = new Double(1.1d); avg[1] = Double.valueOf(2.2d); double db = 3.3d; avg[2] = db; avg[3] = new Double("4.4"); for(int i=0;avg.length>i;i++)System.out.println(avg[i]); String hr = "a"; avgmap.put(hr,avg);