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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

2回答

1569閲覧

Listの中にある重複を取り除くには【Java】

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/05/08 06:49

前提・実現したいこと

eclipseでcsvファイルを読み込み、Listに格納しています。
きちんと格納で来ているかも怪しいのですが、ここからさらに、重複しているデータを一つにまとめたいです。

以下のようなcsvファイルがあり、それを読み込んだという前提があります。
(以前にも似たような質問をさせていただいたのですが、クラスはなくても良いことになりました。)

山田太郎,数学,98 太田靖,国語,79 南義弘,理科,65 藤波健吾,社会,78 太田靖,社会,77 田中康子,理科,88 岡崎理恵,国語,77 山田太郎,社会,68 (以下制限は特になく続く)

その上で、例えば山田太郎は2回登場していますが、この重複をなくし、出力結果には

山田太郎,合計点:(calcSumなどで算出),平均点:(calcAverageなどで算出)

とされるようにしたいと考えています。

cvsファイルの読み取りクラスとPersonクラスが存在しており、calcSum()メソッドはPersonクラスに実装しました。

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

重複した名前を持つデータの結合?の仕方が掴めない

該当のソースコード

Java

1// 読み取りクラス 2public void readCsv(){ 3 4 List<String> data_a = new ArrayList<String>(); 5 String data_s[] = {null}; // 要素数未定のためnull 6 7 File fl = new File("testdata"); 8 9 try(FileReader fr = new FileReader(fl)); 10 BufferedReader in = new BufferedReader(fr){ 11 12 String line; 13 while((line = in.readLine()) != null){ 14 data_s = line.split(",", 0); 15 Person person = new person(data[0], data[1]); 16 17 for(int i = 0; i >= data_s.length ;i++){ 18 // indexOfなど使って重複しているデータを探す? 19 } 20 } 21 } 22} 23 24// Personクラス 25public class Student(){ 26 27 private String name; 28 private List<Subject> subjects = new ArrayList<Subject>(); // 受けた教科を入れる 29 30  // コンストラクタ 31 public Student(String _name){ 32 name = _name; 33 } 34 35 // メソッド 36 // 受けた教科の合計点数を算出したい 37 public Bigdecimal calcSum(){ 38 // BigDecimalの初期化 39 for(Subject subject : subjects){ 40 result.add(subject.getscore()); 41 } 42 return result; 43 } 44} 45

試したこと

indexOfを使ってみたのですが、それだとindexが取得できるだけなのでうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

momon-ga

2020/05/08 07:23

重複がないようにデータを保持したいのか、それとも重複したデータをマージしたいのかで変わると思いますが。 > indexOfを使ってみたのですが、それだとindexが取得できるだけなのでうまくいきませんでした。 indexが取得できるなら、オブジェクトを取得できますよね? ※ そのコードを載せてみれば?
momon-ga

2020/05/08 07:24

結局、Personなの? > Person person = new person(data[0], data[1]); ↑これは、そもそもコンパイルエラーでしょ? Studentなの? > public Student(String _name)
R.Mizukami

2020/05/08 07:40

> きちんと格納で来ているかも怪しいのですが そこを確認せずに次に進むのは無謀です。格納したデータをそのまま出力してみるなど、まずは重複排除以前の部分が適切に作成できているか確認してください。 また、提示コードのエラー箇所が多すぎてどう説明していいか困るレベルなので、せめてコンパイルできるコードを作成し、コピペで記載いただけませんか。 9 行目からのの try のカッコの対応がおかしい 13 行目の while のカッコの対応がおかしい new person の大文字小文字間違い 等
guest

回答2

0

HashMapへ名前をキーにしてStudentを格納すれば、名前の重複は排除できると思います。
containsKeyメソッドで、既にキー値が格納されているかどうか確認できます。

HashMap (Java Platform SE 8)

投稿2020/05/08 07:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

次の質問すべてに答えていただければ、まともな回答ができると思います。

  1. 読み取りクラスの名前は何ですか?

readCsv はメソッド名であり、クラス名ではありません。
Java のプログラムは、クラスの中にフィールやメソッドがあり、
メソッドの中に変数の宣言や文があるという構造になっています。
いきなり readCsv というメソッドで始まるコードは変です。

  1. data_a は readCsv のローカル変数でよいのですか?

ローカル変数は、メソッドの実行が終了すると無くなってしまいます。これを
防ぐためには、readCsv がそのローカル変数の値を return で呼び出し元へ返すか、
あるいは、data_a を読み取りクラスのフィールドにして、
readCsv の呼出し終了後にも、保持する必要があります。

  1. Person person = new person(data[0], data[1]) とありますが、

Personクラスの定義はどこにありますか?
data の宣言はどこにありますか?

  1. result.add(subject.getscore()); とありますが、

result の宣言はどこにありますか?

すべての質問に答えてください。
分からなければ、何が分からないのかを詳しく書いてください。

質問に多くの人からアドバイスをもらってもそれに応えないのは
かなり混乱しているからでしょう。

ではアプローチを変えてみます。
次のコードは思った通りに動きますか?
この問いになら返答できるでしょう。

Java

1import java.io.*; 2import java.util.*; 3 4class Subject { 5 private String name; 6 private int score; 7 8 public Subject(String name, int score) { 9 this.name = name; this.score = score; 10 } 11 12 public String getName() { return name; } 13 public int getScore() { return score; } 14} 15 16class Student { 17 private String room; 18 private String name; 19 private List<Subject> subjects = new ArrayList<Subject>(); 20 21 public Student(String room, String name) { 22 this.room = room; this.name = name; 23 } 24 25 public void add(Subject subject) { subjects.add(subject); } 26 27 public boolean equals(Object o) { 28 Student st = (Student)o; 29 return name.equals(st.name); 30 } 31 32 public int calcSum(){ 33 int sum = 0; 34 for (Subject sj : subjects) sum += sj.getScore(); 35 return sum; 36 } 37 38 public int subjectCount() { return subjects.size(); } 39 40 public String getRoom() { return room; } 41 public String getName() { return name; } 42 public List<Subject> getSubjects() { return subjects; } 43} 44 45// 読み取りクラス 46class DataReader { 47 private List<Student> data_a = new ArrayList<Student>(); 48 49 public List<Student> getData() { return data_a; } 50 51 public void readCsv() { 52 File fl = new File("testdata"); 53 try (FileReader fr = new FileReader(fl); 54 BufferedReader in = new BufferedReader(fr)) { 55 56 String line; 57 while ((line = in.readLine()) != null) { 58 String[] data_s = line.split(","); 59 Student st = new Student(data_s[0], data_s[1]); 60 Subject sj = new Subject(data_s[2], Integer.valueOf(data_s[3])); 61 int i = data_a.indexOf(st); 62 if (i >= 0) 63 data_a.get(i).add(sj); 64 else { 65 st.add(sj); 66 data_a.add(st); 67 } 68 } 69 } catch (IOException ex) { 70 ex.printStackTrace(); 71 } 72 } 73 public void showData() { 74 for (Student st : data_a) { 75 System.out.print(st.getRoom() + " " + st.getName() + ":"); 76 List<Subject> subjects = st.getSubjects(); 77 for (Subject sj : subjects) 78 System.out.print(" " + sj.getName() + ":" + sj.getScore()); 79 System.out.println(); 80 } 81 } 82 83 public void calcData() { 84 for (Student st : data_a) { 85 int sum = st.calcSum(); 86 double ave = (double)sum / st.subjectCount(); 87 System.out.println(st.getName() + ", 合計点:" + sum + ", 平均点:" + ave); 88 } 89 } 90} 91 92class Main { 93 public static void main(String[] args) { 94 DataReader reader = new DataReader(); 95 reader.readCsv(); 96 reader.showData(); 97 reader.calcData(); 98 } 99}

このコードは一つの例であり、質問者の要求に完全に一致するものではない
かもしれません。これを参考に自分のコードが書けるようになってほしいのです。

回答にコードをもらった人の中には、「できました」とか「解決しました」と
いう言葉を残して去っていく人がいます。
本当に内容を理解したのでしょうか?
そうでなければ、何の解決にもなりません。

とにかく動くコードが得られたのですから、文がどの順番に実行され、
変数がどのように変化するのかを追っていかなければなりません。
分からないところがあればそれを調査し、それでも分からなければ
どんどん質問しましょう。

回答へのコメントをお願いします。

投稿2020/05/08 14:50

編集2020/05/09 13:12
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問