質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

791閲覧

連想配列をソートし、リストに変換する

meron-pan

総合スコア44

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/02/17 13:11

編集2018/02/17 13:13

前提・実現したいこと

趣味でjavaを勉強しているものです。連想配列をvalueで昇順ソートしたのち、Listに変換するプログラムを作りたいのですが、このときに配列を二つ用意して「添え字」の値が同じであるならばkeyとvalueが連想配列と一致するようなプログラムを考えています。しかし、まだjavaにあまり詳しくはないので、「連想配列をvalueで昇順ソートし、出力するstream」からどのようにコードを変えていけば良いかわかりません。ご教授お願いします。

具体的な手順
・連想配列をstreamAPIでvalueを昇順ソートし、事前に作成した二つのlistにkeyとvalueそれぞれ別の配列に入れる。

わからない点
・streamで、ソートした後、どのようにlistにそれぞれの値を入れるかがわからない。

実現したいこと

java

1 hashmap.put( "orange", 2); 2 hashmap.put( "pineapple", 3); 3 hashmap.put( "strawberry", 4); 4 hashmap.put( "melon", 5); 5 hashmap.put( "apple", 1); 6 7 8

"apple"、 "orange"、"orange"、"pineapple" ,"strawberry","melon",を格納した「配列1」と1,2,3,4,5を格納した「配列2」を連想配列を用いて作成、「配列1」と「配列2」の添え字がそれぞれ「2」である部分の配列の値を調べると"pineapple"と「3」が出てくる。

該当のソースコード

Java

1//連想配列をvalueで昇順ソートし、出力するstream 2hashmap.entrySet().stream() 3 .sorted(java.util.Map.Entry.comparingByValue()) 4 .forEach(System.out::println);

補足情報(FW/ツールのバージョンなど)

javaのバージョンはjava8を使用。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

java

1import java.util.ArrayList; 2import java.util.HashMap; 3import java.util.List; 4import java.util.Map; 5 6public class MapSort { 7 public static void main(String[] args) { 8 Map<String, Integer> hashmap = new HashMap<String, Integer>(); 9 hashmap.put( "orange", 2); 10 hashmap.put( "pineapple", 3); 11 hashmap.put( "strawberry", 4); 12 hashmap.put( "melon", 5); 13 hashmap.put( "apple", 1); 14 15 //連想配列をvalueで昇順ソートし、出力するstream 16 //hashmap.entrySet().stream() 17 // .sorted(java.util.Map.Entry.comparingByValue()) 18 // .forEach(System.out::println); 19 20 // hashmap.entrySet().stream() 21 // .sorted(java.util.Map.Entry.comparingByValue()) 22 // .forEach(m -> System.out.println(m.getKey() + ":" + m.getValue())); 23 24 List<String> keys = new ArrayList<String>(); 25 List<Integer> vals = new ArrayList<Integer>(); 26 27 hashmap.entrySet().stream() 28 .sorted(java.util.Map.Entry.comparingByValue()) 29 .forEach((entry) -> { 30 keys.add(entry.getKey()); 31 vals.add(entry.getValue()); 32 }); 33 34 for(int i = 0; i < keys.size(); i++) { 35 System.out.println(keys.get(i) + "=" + vals.get(i)); 36 } 37 } 38}

まず、Stream + forEach でソートする例を、key, value にアクセスして処理するするように書き換えてみました。
そのあと、 key, value を list に代入するように書き換えました。

投稿2018/02/17 14:44

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meron-pan

2018/02/17 16:01

コードが短くて、わかりやすくて助かります。javaを勉強し始めたことは、ラムダ式は従来の記述方式とは異なっているので嫌いでしたが、こうしてみて見るとわかりやすくて良いですね。
guest

0

別々の配列を作るなら、別々に作るのが簡単です。
配列の要素をMap.Entryにしたほうが効率はいいと思います。

java

1 public static void main(String[] args) { 2 HashMap<String, Integer> hashmap = new HashMap<>(); 3 hashmap.put("orange", 2); 4 hashmap.put("pineapple", 3); 5 hashmap.put("strawberry", 4); 6 hashmap.put("melon", 5); 7 hashmap.put("apple", 1); 8 9 // それぞれ配列を作る 10 String[] keys = hashmap.entrySet().stream() 11 .sorted(java.util.Map.Entry.comparingByValue()) 12 .map(Map.Entry::getKey) 13 .toArray(String[]::new); 14 Integer[] values = hashmap.entrySet().stream() 15 .sorted(java.util.Map.Entry.comparingByValue()) 16 .map(Map.Entry::getValue) 17 .toArray(Integer[]::new); 18 System.out.println(keys[2]); 19 System.out.println(values[2]); 20 21 // 要素がペアの配列を作る 22 @SuppressWarnings("unchecked") 23 Map.Entry<String, Integer>[] pairs = hashmap.entrySet().stream() 24 .sorted(java.util.Map.Entry.comparingByValue()) 25 .toArray(Map.Entry[]::new); 26 System.out.println(pairs[2].getKey()); 27 System.out.println(pairs[2].getValue()); 28 } 29

投稿2018/02/17 14:58

nakazawaken1

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meron-pan

2018/02/17 16:10

回答ありがとうございます。連想配列なので、てっきり容量の決まっている配列に連想配列が変換できるとは思っていなかったので、目から鱗でした。ただ、まだ自分にはこのコードは少しわかりにくいです、スイマセン。また、最後のコードも、getKeyとgetValueがあるので「コレクション」の一部なのでしょうか?お時間があれば応えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問