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

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

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

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

Q&A

解決済

1回答

920閲覧

重複している要素を抽出し、ファイルに出力ができません。

Sharifa

総合スコア5

Java

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

0グッド

0クリップ

投稿2021/06/29 06:02

編集2021/06/29 06:07

前提・実現したいこと

Javaの課題を解いています。
List1の中にある要素を、HashSetを利用して抽出し、ファイルに「b,c,d」と出力したいのですが、
92行目にあるSystem.out.println(str);のstrには、「b,b,c,d」が格納されてしまい、しかもファイルには「d」のみしか出力されています。

該当のソースコード

Java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileNotFoundException; 4import java.io.FileReader; 5import java.io.FileWriter; 6import java.io.IOException; 7import java.io.PrintWriter; 8import java.util.ArrayList; 9import java.util.HashMap; 10import java.util.HashSet; 11import java.util.List; 12import java.util.Map; 13import java.util.Scanner; 14import java.util.Set; 15 16public class Kadai{ 17 18 public static void main(String[] args) throws IOException { 19 20 /** 21 * ・3つのファイルの中身を行単位で読み込みます。 ・3つのファイルの内容で一致するものがあれば、別ファイルにその一致した内容を書き出します 22 * ・出力ファイル名、入力ファイル名は問いません ・入力ディレクトリ、出力ディレクトリも問いません 23 */ 24 25 ques1(); 26 System.out.println("3つのファイルの中身を行単位で読み込みました"); 27 28 29 } 30 31 private static void ques1() throws IOException { 32 33 try { 34 35 File input1 = new File("/Users/Owner/OneDrive/会社 資料/20_開発課題/01_Java基礎課題L0-L10/参照ファイル/input1.txt"); 36 File input2 = new File("/Users/Owner/OneDrive/会社 資料/20_開発課題/01_Java基礎課題L0-L10/参照ファイル/input2.txt"); 37 File input3 = new File("/Users/Owner/OneDrive/会社 資料/20_開発課題/01_Java基礎課題L0-L10/参照ファイル/input3.txt"); 38 39 if (input1.exists() && input2.exists() && input3.exists()) { // ファイルが存在しているか確認 40 41 List<String> list1 = new ArrayList<>(); 42 43 FileReader filereader1 = new FileReader(input1); 44 FileReader filereader2 = new FileReader(input2); 45 FileReader filereader3 = new FileReader(input3); 46 47 BufferedReader br1 = new BufferedReader(filereader1); 48 BufferedReader br2 = new BufferedReader(filereader2); 49 BufferedReader br3 = new BufferedReader(filereader3); 50 51 String data1; 52 while ((data1 = br1.readLine()) != null) { 53 list1.add(data1); 54 } 55 String data2; 56 while ((data2 = br2.readLine()) != null) { 57 list1.add(data2); 58 } 59 String data3; 60 while ((data3 = br3.readLine()) != null) { 61 list1.add(data3); 62 } 63 64 // setを設定し、する。 65 Set set = new HashSet(); 66 67 FileWriter fw = null; 68 PrintWriter out = null; 69 70 // リストに入っている要素分繰り返す 71 for (String str : list1) { 72 73 // setに追加してみて、追加できなかった(重複していた)ら、strに格納 74 75 if (!set.add(str)) { 76 77 String path = "/Users/Owner/OneDrive/java.txt/input4.txt"; 78 79 //ここで「b,c,d」と、ファイルに書き込まれる 80 81 fw = new FileWriter(path); 82 out = new PrintWriter(fw); 83 84 System.out.println(str);//「b,b,c,d」 85 86 out.write(str);//「d」のみ 87 88 } 89 90 } 91 fw.close(); 92 out.close(); 93 94 } 95 96 } catch (FileNotFoundException e) { 97 System.out.println("ファイルが存在しません。"); 98 } catch (IOException e) { 99 e.printStackTrace(); 100 101 } 102 103 } 104}

試したこと

ほかにも、Setの代わりにMapを使って重複を抽出しましたが、「b、c、d」は格納できたのですが、ファイルにはやはり同じように[d]のみ出力されます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

java

1 fw = new FileWriter(path); 2 out = new PrintWriter(fw);

の定義位置、もしくは使い方ががおかしい。

あなたが使っているコンストラクタはこれ。https://docs.oracle.com/javase/jp/8/docs/api/java/io/FileWriter.html#FileWriter-java.io.File-。ファイルに追記したいのであれば、 https://docs.oracle.com/javase/jp/8/docs/api/java/io/FileWriter.html#FileWriter-java.io.File-boolean- をつかい、fw = new FileWriter(path, true)とする。

もしくは、上記二行の定義位置を見直してみるといい。fw.close()fw = new FileWriter(path)が対になるように。

投稿2021/06/29 06:30

編集2021/06/29 06:51
shiketa

総合スコア3971

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

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

Sharifa

2021/06/29 07:56

ご回答ありがとうございます!なるほどですね。 とりあえずは、 ・ファイルに追記モードで書く ・上記2つの定義位置を変える の2点で修正してみます!
Sharifa

2021/07/01 00:55

あの後、Mapを使って、close();の位置を変えたら、上手く 「b、c、d」と出力されました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問