番号110があったとして、(1100の場合や1~1000の場合も考えられます。なので、中味が空の番号も出てきます)
番号1には、A,B,C
番号2には、F,G,J,I,O
など、番号ごとにアルファベットがランダムで振り分けられるとき、
Mapを使って、MapにIntegerとListを宣言して、Integerに番号を設置した後に、アルファベットを振り分けていく方法が一番、良いのでしょうか?
配列でたとえば
String[][] num = new int[10][];
と宣言して、
配列に追加していくような方法は考えられるでしょうか?
やはり、リストに追加していく方法がベストで、Mapを使うのが一番なのでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
番号ごとにアルファベットがランダムで振り分けられるとき、
Mapを使って、MapにIntegerとListを宣言して、Integerに番号を設置した後に、アルファベットを振り分けていく方法が一番、良いのでしょうか?
『番号を設置した後』でなくていいと思います。
その場合nullを多用することになるので、扱いづらいかと。
イメージ
0 -> null 1 -> 'A', 'B', 'C' 2 -> null 3 -> null ...
追記:
空のリストを放り込む方法もありますが、それだとメモリを無駄に食ってしまう気がします。
どういうふうにアルファベットを割り振っていくのか、
欠番がどれくらい生じるのか、そのあたりの事情に依って戦略は変わってくるでしょう。
適当に番号を生成して、その都度ハッシュマップに追加していけば良いのでは。
Map#containsKey も活用できますし。
イメージ
1 -> 'A', 'B', 'C' 42 -> 'F', 'G', 'J', 'I', 'O' ...
String[][] num = new int[10][];
コンパイルが通りません。
投稿2018/10/02 09:25
編集2018/10/02 09:33総合スコア35658
0
computeIfAbsentとかgetOrDefaultとかを活用
java
1final int MAX = 10; 2Random r = new Random(); 3Map<Integer, List<Character>> map = new HashMap<>(); 4for (int i = 'a'; i <= 'z'; i++) { 5 map.computeIfAbsent(r.nextInt(MAX), x -> new ArrayList<Character>()).add((char)i); 6} 7 8for (int i = 1; i <= MAX; i++) { 9 System.out.println(map.getOrDefault(Collections.emptyList())); 10}
Java9以上ならStreamでこんな書き方もできるが、ここで使っているMap.entryじゃなくても2つの値をペアにしてオブジェクトを作れればなんでもいい
java
1// import static java.util.stream.Collectors.*; 2final int MAX = 10; 3Map<Integer, List<Character>> map 4 = IntStream.rangeClosed('a', 'z') 5 .map(c -> Map.entry((char)c, (int)(Math.random() * MAX + 1)) 6 .collect(groupingBy(e -> e.getValue(), mapping(e -> e.getKey(), toList())));
Java8ならこうなるか
java
1// import static java.util.stream.Collectors.*; 2final int MAX = 10; 3Map<Integer, List<Character>> map 4 = IntStream.rangeClosed('a', 'z') 5 .collect(toMap(c -> (char)c, c -> (int)(Math.random() * MAX + 1)) 6 .entrySet().stream() 7 .collect(groupingBy(e -> e.getValue(), mapping(e -> e.getKey(), toList())));
投稿2018/10/02 13:36
編集2018/10/04 01:39総合スコア20649
0
ベストアンサー
メモリをどのくらい食うかとか気にせずやってみました。
多分パフォーマンスは良くないです。
java
1import java.util.Random; 2import java.util.stream.IntStream; 3import java.util.stream.Collectors; 4import java.util.function.Function; 5import java.util.Map; 6import java.util.HashMap; 7import java.util.List; 8import java.util.ArrayList; 9 10class Main { 11 private static final int MAX = 10; 12 13 public static void main(String[] args) { 14 Random r = new Random(); 15 16 Map<Integer, List<String>> m = IntStream.rangeClosed(1, MAX) 17 .boxed() 18 .collect(Collectors.toMap(Function.identity(), i -> new ArrayList<String>())); 19 20 IntStream.rangeClosed('a', 'z') 21 .mapToObj(i -> String.valueOf((char)i)) 22 .forEach(s -> { 23 Integer i = r.nextInt(MAX) + 1; // 1 .. MAX 24 List<String> target = m.get(i); 25 target.add(s); 26 m.put(i, target); 27 }); 28 29 System.out.println(m); 30 31 } 32}
投稿2018/10/02 11:18
総合スコア6753
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。