前提・実現したいこと
以下の参考資料に記載されているコードを元に
Javaのオブジェクト指向で書かれたプログラムで
csvファイルを読み込み形式を変更した上で新たなcsvファイルを書き出すプログラムです。
以下excelですが、csv形式にしたファイルを読み書きします。
発生している問題・エラーメッセージ
現状のコード(CarクラスとCSVInandOutクラス)では、csvファイルの読み書きは問題なく行われます。これに加え、車種の辞書型データ(JavaではHashMap)に関する実装をCSVInandOutクラスに加えられます。csvで読み込んだ車種(catname)が辞書になければ、カテゴリーのインスタンスが作成され、辞書内に同じ車種(Key)があればそのKey値である個数(num)を1増やすということをCSVInandOutクラスの中で行っています。
現状のプログラムに出力結果を個数の降順に並べて上位10件だけを表示したいです。
ご回答いただいたコードを追記して、プログラムを動かそうとしたところ、
以下のエラーメッセージが下から3行目で出る様になりました。
どのように修正すればいいでしょうか。
エラーメッセージ
メソッド reverseOrder(Map.Entry.comparingByValue()) は型 PolicyUtils.Collections で未定義です
該当のソースコード
Carクラス
public class Car {
String name; //車名
String company; //メーカー
String catname; //車種
//Carクラスに追加したコンストラクタ
//Carクラスに追加したコンストラクタ
Car(String name, String company, String catname){
System.out.println("Carクラスのコンストラクタが呼びだされました");
this.name = name;
this.company = company;
this.catname = catname;
}
@Override
public String toString() {
return name + "," + company + "," + catname;
}
}
CSVInandOutクラス
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Collections;
public class CSVinandOut {
public static void main(String[] args) {
List<Car> carList = new ArrayList<Item>(); //データ格納用リスト
Map<String, Integer> cat_num = new HashMap<>();
String input = "carIn.csv";
String output = "carOut.csv";
try(BufferedReader InputLine = new BufferedReader(new FileReader(input));
PrintWriter outputLine = new PrintWriter(new FileWriter(output))) {
String line;
line = InputLine.readLine(); //ヘッダの読み書き
outputLine.println(line);
//1行ずつ読み込み
while ((line = InputLine.readLine()) != null) { //String変数lineに格納
String[] st = line.split(","); //lineを分割の対象にする
Item item = new Item(st[0], st[1], st[2]);
itemList.add(item); //リストに追加する
cat_num.merge(car.catname, 1, Integer::sum);
outputLine.println(item);
}
}
catch (IOException e) {
System.out.println("ファイルが開けません");
}
for(Entry<String, Integer> entry : cat_num.entrySet()){
System.out.println(entry.getKey() + ":" + entry.getValue());
}
//ご回答いただいたコード
cat_num.entrySet()
.stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) //valueの降順にする
.limit(5) //上位5位まで(適宜直してください)
.forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); //結果出力
}
}
補足情報(FW/ツールのバージョンなど)
Eclipse Java EE IDE for Web Developers.
Version: Oxygen.3a Release (4.7.3a)
Microsoft Excel for Mac バージョン16.13
Javaバージョン(java.version):1.8.0_152
オペレーティングシステム名(os.name):Mac OS X
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
HashMapのValueをソートキーにして降順で出力したい、ということであれば、
map.entrySet()
.stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) //valueの降順にする
.limit(5) //上位5位まで(適宜直してください)
.forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); //結果出力
これでできると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
mather
2018/06/04 20:21
Excelはタグから削除したほうが良いと思います。
euledge
2018/06/05 01:24 編集
shoChanさんが回答された実装例は Java8以降のものなのでバージョンに制約があるならば、バージョンを示したほうが良いと思います。個人的には新しいJavaで学習したほうが良いとは思いますよ。 同じ研究室の資料にある 2016,2018年あたりのもの見比べてみてはどうでしょう。
またEclipseも、その参考資料のものより Pleiades All in One( http://mergedoc.osdn.jp/ )にあるほうが最新版です。
tenjin
2018/06/05 11:46
コメントいただきましてありがとうございます。追記させていただきました。ただ、今問題になっているのはshoChanさんにご回答いただいた実装例をCSVInandOutクラスのどこに組み込めばいいのか理解できていないということです。長期的な勉強として他の資料も拝見させていただきます。
2018/06/05 12:47
複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。