🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

3回答

1100閲覧

Javaでテキストファイルを読み込み、eclipseで内容を編集し、求めている通りに出力する方法

okatyann

総合スコア4

Java

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

0グッド

0クリップ

投稿2019/12/16 23:30

現在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ページで確認できます。

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

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

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

y_waiwai

2019/12/16 23:34 編集

> (上記1の最小値の個数) 上記1、とはどこの1のはなしかな?
m.ts10806

2019/12/16 23:33

eclipseはあくまでコードを書くツールであって「コードで読み込んだファイルを編集するもの」ではないのですが、全体像としてはどのような役割を期待した表現なのでしょうか
okatyann

2019/12/16 23:39

テキストファイル側に 3,24 1,1 (以下略) とありますが、一列目の数字が上記1です。 例えば3,24なら3が上記3といった感じです。
guest

回答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

xebme

総合スコア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

TN8001

総合スコア9855

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

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

0

  1. 数字1の場合
  2. 最小値変数とカウント変数を用意、最小値変数には十分大きい値を入れておく
  3. 1行読む
  4. 読めなかったら終了
  5. コンマで区切った数字2つを取得
  6. 最初の数字が1.に合致しなかったら3.に戻る
  7. 2番めの数字と最小値変数を比較
  8. 小さいときは最小値変数にその数字を代入しカウント変数を1にする
  9. 同一ならカウント変数を+1
  10. 3.に戻る

で、1.の数字を順次変えて繰り返してやればよろしい

投稿2019/12/17 00:01

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問