現在Javaを勉強している者です。Javaでテキストファイルを読み込み、
eclipseで内容を編集し、求めている通りに出力する方法を教えていただきたいです。
例えば下記のテキストファイルがあった場合・・・
3,24
1,1
3,26
2,41
1,96
3,14
2,51,
1,1
3,21
2,11
下記の結果を出力したいです。
1
(上記1の最小値の個数)
2
(上記2の最小値の個数)
3
(上記3の最小値の個数)
※4…5…6とテキスト側で追加できる
void showFirst(){
System.out.println("データの先頭表示");
for( int key: this.keySet() ){
final ArrayList<Integer> temp = this.get(key);
final int firstValue = temp.get(0);
System.out.println(key+":"+firstValue );
}
System.out.println();
}
***
data.show();
data.sort();
data.show();
data.showFirst();
最小値を求めるプログラミングはできましたが求めている最小値の個数を求めることが自力ではできません。ご教授お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
Mapの利用と整列
以前、解答で使った、Streamの集計機能を再利用します。Java:コードをスッキリさせたい
- Collectors#groupingBy()を使ってMapに格納します。(Mapのインスタンスを自分で作らない)
- TreeMapを使って整列させます。(自分でソートしない)
タプル
x,y
を分解して格納するのにタプルを使いたいのですが、代わりにAbstractMap.SimpleEntry<K,V>を使います。
Java
1import static java.util.AbstractMap.SimpleEntry; 2 3// その他のimport 4import java.util.Arrays; 5import java.util.Map; 6import java.util.TreeMap; 7import java.util.stream.Collectors;
簡単のため、入力データをStringで定義します。
Java
1String input = "3,24\n1,1\n3,26\n2,41\n1,96\n3,14\n2,51,\n1,1\n3,21\n2,11";
SimpleEntryとStreamを使用して集計します。
Java
1Map<String,Map<String,Long>> freqs = Arrays.stream(input.split("\n")) 2 .map(line -> {String[] t = line.split(",");return new SimpleEntry<>(t[0],t[1]);}) 3 .collect( 4 Collectors.groupingBy( 5 SimpleEntry::getKey, 6 TreeMap::new, 7 Collectors.groupingBy( 8 SimpleEntry::getValue, 9 TreeMap::new, 10 Collectors.counting()) // 件数を数える 11)); 12System.out.println(freqs); 13freqs.entrySet().stream().map(e -> e.getKey() + " " + e.getValue().entrySet().iterator().next()).forEach(System.out::println); 14
投稿2019/12/18 17:27
総合スコア1090
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
showFirstの仕様からソート後に使うという前提で。
Java
1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 new Main(); 6 } 7 8 private Main() { 9 final String input 10 = "3,24\n" + 11 "1,1\n" + 12 "3,26\n" + 13 "2,41\n" + 14 "1,96\n" + 15 "3,14\n" + 16 "2,51,\n" + // ここのカンマ? 17 "1,1\n" + 18 "3,21\n" + 19 "2,11"; 20 21 // ファイルから読む部分は省略 22 final MyMap data = new MyMap(input); 23 data.show(); 24 data.sort(); 25 data.show(); 26 data.showFirst(); 27 data.showFirstCount(); 28 } 29 30 class MyMap extends HashMap<Integer, ArrayList<Integer>> { 31 32 MyMap(String input) { 33 System.out.println("データの入力\n"); 34 input = input.replace("\r\n", "\n").replace("\r", "\n"); 35 36 for (String line : input.split("\n")) { 37 final int[] temp = Arrays.stream(line.split(",")) 38 .filter(s -> !s.isEmpty()) 39 .mapToInt(Integer::parseInt) 40 .toArray(); 41 if (this.containsKey(temp[0])) { 42 this.get(temp[0]).add(temp[1]); 43 } else { 44 this.put(temp[0], new ArrayList<>(Arrays.asList(temp[1]))); 45 } 46 } 47 } 48 49 void show() { 50 System.out.println("データを全て表示"); 51 for (int key : this.keySet()) { 52 final ArrayList<Integer> temp = this.get(key); 53 System.out.println(key + ":" + temp.toString()); 54 } 55 System.out.println(); 56 } 57 58 void sort() { 59 System.out.println("データを並び替え\n"); 60 for (int key : this.keySet()) { 61 final ArrayList<Integer> temp = this.get(key); 62 Collections.sort(temp); 63 } 64 } 65 66 void showFirst() { 67 System.out.println("データの先頭表示"); 68 for (int key : this.keySet()) { 69 final ArrayList<Integer> temp = this.get(key); 70 final int firstValue = temp.get(0); 71 System.out.println(key + ":" + firstValue); 72 } 73 System.out.println(); 74 } 75 76 void showFirstCount() { 77 System.out.println("データの先頭の個数表示"); 78 for (int key : this.keySet()) { 79 final ArrayList<Integer> temp = this.get(key); 80 final int firstValue = temp.get(0); 81 int valueCount = 0; 82 for (int value : temp) { 83 if (value != firstValue) { 84 break; 85 // sortしてから使うと思われたのでbreakにした 86 // continue; 87 } 88 valueCount++; 89 } 90 // continue版と同等 91 // final long valueCount = temp.stream().filter(x -> x == firstValue).count(); 92 93 System.out.println(key + ":" + firstValue + "*" + valueCount); 94 } 95 System.out.println(); 96 } 97 } 98}
出力
データの入力 データを全て表示 1:[1, 96, 1] 2:[41, 51, 11] 3:[24, 26, 14, 21] データを並び替え データを全て表示 1:[1, 1, 96] 2:[11, 41, 51] 3:[14, 21, 24, 26] データの先頭表示 1:1 2:11 3:14 データの先頭の個数表示 1:1*2 2:11*1 3:14*1
dataの使い方からクラスを再現しましたが、こんな感じでいいんでしょうか? こっちのほうが難しい気が
投稿2019/12/17 12:53
総合スコア9855
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。