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

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

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

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

Q&A

解決済

3回答

8012閲覧

ファイル読み込み、ソート

wakataku1318

総合スコア19

Java

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

0グッド

0クリップ

投稿2017/01/19 11:51

###前提・実現したいこと
avaを使用しております。
プログラムの引数で入力ファイルを読み込む。ただし、入力ファイルにはコンマ区切りで学生番号、氏名、国語の点、英語の点、数学の点がかかれています。読み込んだ内容を表示し,3教科の合計点順にソートし,ソートした結果を表示する。その後,引数で指定した出力ファイルにコンマ区切りで,学籍番号,氏名,国語の点,数学点,英語の点,合計点を出力するプログラムの作成をしています。入力ファイルはK71i.csvです.

また以下の仕様を満たしたいです。
Studentクラスを実装
・学籍番号,氏名,国語の点,数学の点,英語の点,合計点を格納すprotectedメンバーを実装
・それぞれのメンバーのゲッターメソッド,セッターメソッドを実装
・学籍番号,氏名,国語の点数,数学の点数,英語の点数を引数とするコンストラクタを実装

StudentListクラスを実装
・ArrayList<Student>型のprotectedメンバーを実装
・ファイル名を引数として,ファイルの内容をArrayListに格納するreadData(String name)メソッドを実装
・ArrayListに格納されたデータを合計点の高い順にソートするsortData()メソッドを実装
・ArrayListに格納されたデータを表示するshowData()メソッドを実装
・ファイル名を引数として,ArrayListの内容をファイルに出力するwriteData(String name)メソッドを実装
・データ数は不定とする(いくつでも対応できるようにする)

はっきりいって何をしたら良いかがさっぱりです。
ArrayListに格納というのもやり方が分かりません。
ファイルから読み込むということもよくわからないです。

よければ丁寧に一つずつ教えていただけると幸いです。

先ほどの質問に少し修正を加えてみました。
ファイルの読み込みについてはおそらく大丈夫・・・

ソートがわからないです・・・。
国語、数学、英語の点数がどこにあって、どのようにすれば使えるのおかがわからないです・・・。

またここ違うよ!などの指摘もほしいです。よろしくお願いします!

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

java

1import java.io.*; 2import java.io.FileReader; 3import java.io.BufferedReader; 4import java.util.StringTokenizer; 5import java.io.IOException; 6import java.util.ArrayList; 7 8public class Kadai71{ 9 public static void main (String[] args) throws FileNotFoundException, IOException{ 10 11 try{ 12 FileReader fr = new FileReader("kadai71i.csv"); 13 BufferedReader br = new BufferedReader(fr); 14 15 String line; 16 StringTokenizer token; 17 while((line = br.readLine()) != null){ 18 token = new StringTokenizer(line,","); 19 20 while(token.hasMoreTokens()){ 21 System.out.println(token.nextToken()); 22 } 23 } 24 br.close(); 25 26 } catch(IOException ex) { 27 ex.printStackTrace(); 28 } 29 30 } 31} 32 33/** 34*学籍番号、氏名、国語、英語、数学の点数、合計点を格納するStudentクラス 35*/ 36class Student { 37 38 /** 39 *学籍番号を表します 40 */ 41 protected int number; 42 43 /** 44 *氏名を表します 45 */ 46 protected String name; 47 48 /** 49 *国語の点数を表します 50 */ 51 protected int japanese; 52 53 /** 54 *数学の点数を表します 55 */ 56 protected int math; 57 58 /** 59 *英語の点数を表します 60 */ 61 protected int english; 62 63 /** 64 *合計点を表します 65 */ 66 protected int total; 67 68 /** 69 *学籍番号、氏名、国語、数学、英語の点数を設定するコンストラクタ 70 */ 71 public Student(int n, String N, int j, int m, int e){ 72 number = n; 73 name = N; 74 japanese = j; 75 math = m; 76 english = e; 77 } 78 79 80 /** 81 *学籍番号を返すメソッド 82 */ 83 public int getNumber(){ 84 return number; 85 } 86 87 /** 88 *氏名を返すメソッド 89 */ 90 public String getName(){ 91 return name; 92 } 93 94 /** 95 *国語の点数を返すメソッド 96 */ 97 public int getJapanese(){ 98 return japanese; 99 } 100 101 /** 102 *数学の点数を返すメソッド 103 */ 104 public int getMath(){ 105 return math; 106 } 107 108 /** 109 *英語の点数を返すメソッド 110 */ 111 public int getEnglish(){ 112 return english; 113 } 114 115 /** 116 *合計点を返すメソッド 117 */ 118 public int getTotal(){ 119 return total; 120 } 121 122 /** 123 *国語、数学、英語の合計点を計算してセットするメソッド 124 */ 125 public void setTotal(int a, int b, int c){ 126 total = a + b + c; 127 } 128} 129 130class StudentList{ 131 /** 132 *ArrayList<String>型のprotectedメンバーの実装 133 */ 134 protected ArrayList<String> al = new ArrayList<String>(); 135 protected String line; 136 137 /** 138 *ファイル名を引数として、ファイルの内容をArrayListに保存する 139 */ 140 public String readData(String name){ 141 BufferedReader in = new BufferedReader(name); 142 while((line = in.readLine()) != null){ 143 al = line.split("\\,"); 144 } 145 } 146 147 /** 148 *ArrayListに格納されたデータを合計点の高い順にソートするメソッド 149 */ 150 public int sortData(){ 151 152 } 153 154} 155

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答3

0

ベストアンサー

見出しがなくデータのみの.csvであれば
以下でできるのではないでしょうか
完全に目的とする基準を満たしているかどうかは分かりませんが、何かの参考にはなるのではないかと思います

java

1import java.io.*; 2import java.io.FileReader; 3import java.io.BufferedReader; 4import java.util.StringTokenizer; 5import java.io.IOException; 6import java.util.ArrayList; 7import java.util.*; 8 9public class OM extends StudentList { 10 public static void main(String[] args) throws FileNotFoundException, 11 IOException { 12 13 OM aq = new OM(); 14 aq.readData("9.csv"); 15 aq.sortData(); 16 aq.writeData("19.csv"); 17 18 } 19} 20 21/** 22 * 学籍番号、氏名、国語、英語、数学の点数、合計点を格納するStudentクラス 23 */ 24class Student { 25 26 /** 27 * 学籍番号を表します 28 */ 29 protected int number; 30 31 /** 32 * 氏名を表します 33 */ 34 protected String name; 35 36 /** 37 * 国語の点数を表します 38 */ 39 protected int japanese; 40 41 /** 42 * 数学の点数を表します 43 */ 44 protected int math; 45 46 /** 47 * 英語の点数を表します 48 */ 49 protected int english; 50 51 /** 52 * 合計点を表します 53 */ 54 protected int total; 55 56 /** 57 * 学籍番号、氏名、国語、数学、英語の点数を設定するコンストラクタ 58 */ 59 public Student(int n, String N, int j, int m, int e) { 60 number = n; 61 name = N; 62 japanese = j; 63 math = m; 64 english = e; 65 } 66 67 /** 68 * 学籍番号を返すメソッド 69 */ 70 public int getNumber() { 71 return number; 72 } 73 74 /** 75 * 氏名を返すメソッド 76 */ 77 public String getName() { 78 return name; 79 } 80 81 /** 82 * 国語の点数を返すメソッド 83 */ 84 public int getJapanese() { 85 return japanese; 86 } 87 88 /** 89 * 数学の点数を返すメソッド 90 */ 91 public int getMath() { 92 return math; 93 } 94 95 /** 96 * 英語の点数を返すメソッド 97 */ 98 public int getEnglish() { 99 return english; 100 } 101 102 /** 103 * 合計点を返すメソッド 104 */ 105 public int getTotal() { 106 return total; 107 } 108 109 /** 110 * 国語、数学、英語の合計点を計算してセットするメソッド 111 */ 112 public void setTotal(int a, int b, int c) { 113 total = a + b + c; 114 } 115} 116 117class StudentList { 118 /** 119 * ArrayList<Student>型のprotectedメンバーの実装 120 */ 121 protected ArrayList<Student> al = new ArrayList<Student>(); 122 protected String line; 123 124 /** 125 * ファイル名を引数として、ファイルの内容をArrayListに保存する 126 */ 127 public void readData(String name) { 128 try (BufferedReader in = new BufferedReader(new FileReader(name))) { 129 while ((line = in.readLine()) != null) { 130 String[] als = line.split(","); 131 Student as = new Student(Integer.parseInt(als[0]), als[1], 132 Integer.parseInt(als[2]), Integer.parseInt(als[3]), 133 Integer.parseInt(als[4])); 134 as.setTotal(Integer.parseInt(als[2]), Integer.parseInt(als[3]), 135 Integer.parseInt(als[4])); 136 al.add(as); 137 } 138 } catch (Exception e) { 139 } 140 } 141 142 public void writeData(String name) { 143 try (BufferedWriter in = new BufferedWriter(new FileWriter(name))) { 144 145 for (int i=0;i<al.size();i++) { 146 in.write(al.get(i).getNumber() + "," + al.get(i).getName() + "," 147 + al.get(i).getJapanese() + "," + al.get(i).getMath() + "," 148 + al.get(i).getEnglish() + "," + al.get(i).getTotal()); 149 in.newLine(); 150 } 151 152 153 } catch (Exception e) { 154 } 155 } 156 157 /** 158 * ArrayListに格納されたデータを合計点の高い順にソートするメソッド 159 */ 160 public void sortData() { 161 162 Collections.sort(al, new N()); 163 } 164 165} 166 167class N implements Comparator<Student> { 168 169 public int compare(Student b, Student c) { 170 171 Integer n = b.getTotal(); 172 Integer m = c.getTotal(); 173 return m.compareTo(n); 174 } 175 176}

投稿2017/01/19 13:04

編集2017/01/20 10:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

wakataku1318

2017/01/20 04:54

回答ありがとうございます。 一つ質問なのですが、 writeDataメソッドの for (Student d : al) はどういった意味でしょうか? 互換性のない型としてエラーが出てしまうので、もしよければお教え願います。
退会済みユーザー

退会済みユーザー

2017/01/20 10:32

拡張for文というもので、for文内で変数dにal内のStudentクラスを最初から順に入れていく操作ですが、 環境によっては実行できないかもしれないので 上記回答のコードのwriteData内を変更して拡張for文を使わないものに変更しておきます
wakataku1318

2017/01/20 13:36

ありがとうございます。
guest

0

しょうがないのでちょっと答えますと

ソートがわからないです・・・。

こう言うクラスを利用したソースの方法は下記のやり方で出来ます。

java

1{ 2 Collections.sort(Database.arrayList, new CustomComparator); 3} 4Collections.sort(Database.arrayList, new Comparator< Student >() { 5 @Override 6 public int compare(Student student1, Student student2) { 7 return student1.getTotal().compareTo(student2.getTotal()); 8 } 9});

http://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property

初心者の方でしたら
EFFECTIVE JAVA 第2版 (The Java Series)(amazon)

これ読めばこの程度は出来ますよ

投稿2017/01/19 12:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

あなた、Javaの学習何か月目でしょうか?
4月入学として10カ月でしょうか?

仕事についたらこんなものは1日で仕上げる量ですよ。
卒業して就職したときのことを考えなさい。

プログラムは複雑でいちいち説明しても膨大な量ですし、
あなたのためには先生にイチから教えてもらうことですね。

投稿2017/01/19 12:34

maiko0318

総合スコア876

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

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

syachiku

2017/01/20 01:32

それを回答として載せる意味あります?
maiko0318

2017/01/20 03:18

あなたのためです。 答えを載せるより有用と考えました。
ynakano

2017/01/20 04:01

maiko0318さんの回答内容は必ずしも質問内容と噛み合っているとも思わないのですが、こう言いたくなるのは理解できます。 私は質問文を読んでいて(ご自身にそのつもりはないのかもしれませんが)丸投げと受け止めました。 以下、そう感じた部分です。 はっきりいって何をしたら良いかがさっぱりです。 → 「xxxクラスを実装すること」という部分だけでもすべきことは見えていると思います。 ArrayListに格納というのもやり方が分かりません。 ファイルから読み込むということもよくわからないです。 → ググれば分かります。ググって分からないのなら、何がどう分からないのか書くべきです。 よければ丁寧に一つずつ教えていただけると幸いです。 → ここはサポセンではありません。ご自身でやれるだけのことはやるのが大前提です。
syachiku

2017/01/20 04:05

maiko0318さん。意味分からないですね。脊髄反射でコメント投稿しない方がいいですよ。
syachiku

2017/01/20 04:09 編集

ynakanoさん。言いたいことは分かりますが回答として載せるのは不適切ですね。「質問への追記・修正の依頼」というフォームがあるので質問の回答になり得ない文章はそちらに記述するべきでは?これではよくある知恵袋の何の役にも立たない回答者の自己満足な煽りにしかなりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問