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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

解決済

1回答

2759閲覧

出力結果を降順にソートし、上位10件を表示する方法について

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2018/06/04 10:54

編集2018/06/05 06:04

前提・実現したいこと

以下の参考資料に記載されているコードを元に
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クラス

Java

1 2public class Car { 3 4 String name; //車名 5 String company; //メーカー 6 String catname; //車種 7 8 9 //Carクラスに追加したコンストラクタ 10 //Carクラスに追加したコンストラクタ 11 Car(String name, String company, String catname){ 12 System.out.println("Carクラスのコンストラクタが呼びだされました"); 13 this.name = name; 14 this.company = company; 15 this.catname = catname; 16 } 17 18 @Override 19 public String toString() { 20 return name + "," + company + "," + catname; 21 } 22 }

CSVInandOutクラス

Java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.FileWriter; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.util.ArrayList; 7import java.util.HashMap; 8import java.util.List; 9import java.util.Map; 10import java.util.Map.Entry; 11 12import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Collections; 13 14public class CSVinandOut { 15 public static void main(String[] args) { 16 List<Car> carList = new ArrayList<Item>(); //データ格納用リスト 17 Map<String, Integer> cat_num = new HashMap<>(); 18 String input = "carIn.csv"; 19 String output = "carOut.csv"; 20 21 try(BufferedReader InputLine = new BufferedReader(new FileReader(input)); 22 PrintWriter outputLine = new PrintWriter(new FileWriter(output))) { 23 24 String line; 25 26 line = InputLine.readLine(); //ヘッダの読み書き 27 outputLine.println(line); 28 29 //1行ずつ読み込み 30 while ((line = InputLine.readLine()) != null) { //String変数lineに格納 31 String[] st = line.split(","); //lineを分割の対象にする 32 Item item = new Item(st[0], st[1], st[2]); 33 itemList.add(item); //リストに追加する 34 cat_num.merge(car.catname, 1, Integer::sum); 35 outputLine.println(item); 36 } 37 38 } 39 40 catch (IOException e) { 41 System.out.println("ファイルが開けません"); 42 } 43 44 45 for(Entry<String, Integer> entry : cat_num.entrySet()){ 46 System.out.println(entry.getKey() + ":" + entry.getValue()); 47 } 48 49 //ご回答いただいたコード 50 cat_num.entrySet() 51 .stream() 52 .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) //valueの降順にする 53 .limit(5) //上位5位まで(適宜直してください) 54 .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); //結果出力 55 } 56} 57 58

補足情報(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

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

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

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

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

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

mather

2018/06/04 11:21

Excelはタグから削除したほうが良いと思います。
euledge

2018/06/04 16:28 編集

shoChanさんが回答された実装例は Java8以降のものなのでバージョンに制約があるならば、バージョンを示したほうが良いと思います。個人的には新しいJavaで学習したほうが良いとは思いますよ。 同じ研究室の資料にある 2016,2018年あたりのもの見比べてみてはどうでしょう。 またEclipseも、その参考資料のものより Pleiades All in One( http://mergedoc.osdn.jp/ )にあるほうが最新版です。
退会済みユーザー

退会済みユーザー

2018/06/05 02:46

コメントいただきましてありがとうございます。追記させていただきました。ただ、今問題になっているのはshoChanさんにご回答いただいた実装例をCSVInandOutクラスのどこに組み込めばいいのか理解できていないということです。長期的な勉強として他の資料も拝見させていただきます。
guest

回答1

0

ベストアンサー

HashMapのValueをソートキーにして降順で出力したい、ということであれば、

java

1map.entrySet() 2.stream() 3.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) //valueの降順にする 4.limit(5) //上位5位まで(適宜直してください) 5.forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); //結果出力 6

これでできると思います。

投稿2018/06/04 13:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/06/05 01:31

ご回答いただきましてありがとうございます。 ご回答いただいたコードはCSVInandOutクラスのどこに挿入することになるのでしょうか。お手数ですが、教えていただけますと助かります。
swordone

2018/06/05 03:08

これが何をするものか分かりますか? それがわかれば、おのずとどこに入れるかはわかると思うのですが。
退会済みユーザー

退会済みユーザー

2018/06/05 03:16

for(Entry<String, Integer> entry : cat_num.entrySet()){ System.out.println(entry.getKey() + ":" + entry.getValue()); } ではHashMapのKeyとValueを出力しているのでこの周辺ということは察しがつきますが、一般的な形でコードが示されているのでどこに入れるかわかりません。
退会済みユーザー

退会済みユーザー

2018/06/05 03:50

その一般的なコードがわからないなら基礎から学びなおしたほうが早いよ
mather

2018/06/05 06:23

> 出力結果を個数の降順に並べて上位10件だけを表示したい とご自身で書いているように、その部分に挿入すれば良いと思いますよ。
退会済みユーザー

退会済みユーザー

2018/06/05 06:52

プログラムに回答いただいたコードを組み込んで実行したところ、エラーが表示されてしまいました。お手数おかけしますが、修正いたしました質問をご確認いただけますでしょうか。
swordone

2018/06/05 08:37

importしているCollectionsクラスが違う 正しくはjava.util.Collections
退会済みユーザー

退会済みユーザー

2018/06/05 11:59

ご回答とご指導のほどありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問