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

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

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

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

Q&A

解決済

2回答

496閲覧

条件を指定し、別のファイルで出力する方法

tuka

総合スコア13

Java

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

0グッド

0クリップ

投稿2022/07/02 15:28

出力されるファイルの各行にブロック開始({)、終了(})、開始終了({})があれば、それぞれ:の後に+、ー、*を出力させるプログラムを書きたいです。

やったこと

java

1import java.io.*; 2import java.util.ArrayList; 3 4public class AddLineNumber { 5 6 public static void main(String[] args) { 7 try { 8 FileReader fr = new FileReader("AddLineNumber.java"); 9 BufferedReader br = new BufferedReader(fr); 10 11 FileWriter fw = new FileWriter("Output.txt"); 12 BufferedWriter bw = new BufferedWriter(fw); 13 14 String s; 15 int lineNumber = 1; 16 while ((s = br.readLine()) != null) { 17 ArrayList<String> strs = new ArrayList<String>(); 18 strs.add(s); 19 if (strs.contains("{")) { 20 bw.write(String.format("%04d", lineNumber) + ":" + "+" + " " + s + "\r\n"); 21 } 22 if (strs.contains("}")) { 23 bw.write(String.format("%04d", lineNumber) + ":" + "-" + " " + s + "\r\n"); 24 } 25 if (strs.contains("{" + "}")) { 26 bw.write(String.format("%04d", lineNumber) + ":" + "*" + " " + s + "\r\n"); 27 } else { 28 bw.write(String.format("%04d", lineNumber) + ":" + " " + s + "\r\n"); 29 } 30 lineNumber++; 31 } 32 br.close(); 33 bw.close(); 34 } catch (IOException e) { 35 System.out.println(e); 36 } 37 } 38}

リストを作りファイルを一行ずつ読み取りcontainsメソッドでその行に含まれているか判定。含まれていたら書式を指定し出力

出力結果

Output.txt

10001: import java.io.*; 20002: import java.util.ArrayList; 30003: 40004: public class AddLineNumber { 50005: 60006: public static void main(String[] args) { 70007: try { 80008: FileReader fr = new FileReader("AddLineNumber.java"); 90009: BufferedReader br = new BufferedReader(fr); 100010: 110011: FileWriter fw = new FileWriter("Output.txt"); 120012: BufferedWriter bw = new BufferedWriter(fw); 130013: 140014: String s; 150015: int lineNumber = 1; 160016: while ((s = br.readLine()) != null) { 170017: ArrayList<String> strs = new ArrayList<String>(); 180018: strs.add(s); 190019: if (strs.contains("{")) { 200020: bw.write(String.format("%04d", lineNumber) + ":" + "+" + " " + s + "\r\n"); 210021: } 220022: if (strs.contains("}")) { 230023: bw.write(String.format("%04d", lineNumber) + ":" + "-" + " " + s + "\r\n"); 240024: } 250025: if (strs.contains("{" + "}")) { 260026: bw.write(String.format("%04d", lineNumber) + ":" + "*" + " " + s + "\r\n"); 270027: } else { 280028: bw.write(String.format("%04d", lineNumber) + ":" + " " + s + "\r\n"); 290029: } 300030: lineNumber++; 310031: } 320032: br.close(); 330033: bw.close(); 340034: } catch (IOException e) { 350035: System.out.println(e); 360036: } 370037: } 380038:- } 390038: } 40

 その行に空白が含まれると空白以前までしか判定されない?のか38行目しか思い通りの結果にならなかった。
どなたか解決方法教えてください。

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

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

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

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

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

guest

回答2

0

一行入力に対し処理をして一行出力するだけですので、ArrayList に保存する意味はありません。
RiaFeed さんがご指摘のように、判断と処理を一つずつ書く方法では、複数の条件に一致する可能性がある場合は注意が必要です。
以下のコードでは "{","}" の有無判断を変数 c に 0~3 として一旦保存し、それから文字化しています。
ついでに、クローズする必要のある処理は、可能であれば try-with-resources で書いたほうが close を並べる必要無くかつ確実に close されます。

java

1package teratail_java.q_6hgy0u9a4yg0a0; 2 3import java.io.*; 4 5public class AddLineNumber { 6 public static void main(String[] args) { 7 try(BufferedReader br = new BufferedReader(new FileReader("AddLineNumber.java")); 8 PrintWriter pw = new PrintWriter(new FileOutputStream("Output.txt"));) { 9 String line; 10 for(int no=1; (line=br.readLine()) != null; no++) { 11 int c = (line.contains("{") ? 1 : 0) + (line.contains("}") ? 2 : 0); 12 pw.printf("%04d:%c %s\n", no, " +-*".charAt(c), line); 13 } 14 } catch(IOException e) { 15 e.printStackTrace(); 16 } 17 } 18}

実行結果(Output.txt)

plain

10001: package teratail_java.q_6hgy0u9a4yg0a0; 20002: 30003: import java.io.*; 40004: 50005:+ public class AddLineNumber { 60006:+ public static void main(String[] args) { 70007: try(BufferedReader br = new BufferedReader(new FileReader("AddLineNumber.java")); 80008:+ PrintWriter pw = new PrintWriter(new FileOutputStream("Output.txt"));) { 90009: String line; 100010:+ for(int no=1; (line=br.readLine()) != null; no++) { 110011:* int c = (line.contains("{") ? 1 : 0) + (line.contains("}") ? 2 : 0); 120012: pw.printf("%04d:%c %s\n", no, " +-*".charAt(c), line); 130013:- } 140014:* } catch(IOException e) { 150015: e.printStackTrace(); 160016:- } 170017:- } 180018:- }

投稿2022/07/02 17:02

編集2022/07/02 17:34
jimbe

総合スコア12545

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

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

tuka

2022/07/03 01:21 編集

回答ありがとうございます。なるほど、文字の有無判断を数字としていったん保存する方法は思いつきませんでした。try-with-resources文でリソースを宣言することができることも初めて知りました。参考にさせていただきます!
jimbe

2022/07/03 04:08

条件から N 個の何かを選択する場合、条件から0~N-1 の値を生成できれば、その後の処理に配列(本件では文字が必要なので文字配列としての文字列)が利用できます。 "条件"と"処理"の間にどのような関係があるか、そしてそれを簡潔に表す値はどのようなものがあるかを気にしながらプログラムを作れるようになると、かなりコードが変わると思います。
guest

0

ベストアンサー

上手くいかない理由は提示のコードでは文字列に対してcontainsしているのではなく、ArrayList<String>に対してcontainsしているからです。
提示のコードの範囲では読み込んだコードをArrayList<String>に格納する必要性が全くありませんので、
1行読み込んだ文字列が入っているsに対してcontainsすればいいんじゃないでしょうか。

とはいえそもそも+-*を付与するロジックも間違ってまして、このままだと
片方だけある行は+または-のついたコードと何もついてないコードが二重に表示され。
両方ある行は+-が付いたコードと何もついてないコードが三重に表示され。({}がある行を除く)
{}のある行は+-*がついたコードが三重に表示されます。
{ }のあるなしの判定結果をboolean変数で記憶して後でその変数を基に行を出力するコードにしてみては。

投稿2022/07/02 15:45

編集2022/07/02 15:50
RiaFeed

総合スコア2701

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

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

tuka

2022/07/02 16:24

回答ありがとうございます。「{ }のあるなしの判定結果をboolean変数で記憶して後でその変数を基に行を出力するコード」とはどのように書けばよいのでしょうか。boolean変数でboolean b1 = s.contains("{");のようにしてif文で行を出力するコードを書いてみましたが、経験が浅くRiaFeedさんの言う通り、二重三重で表示されてしまいました。
RiaFeed

2022/07/02 16:48

こんな感じですかね String s; String addstr; int lineNumber = 1; while ((s = br.readLine()) != null) { boolean left = s.contains("{"); boolean right = s.contains("}"); if (left && right) { addstr = "*"; }else if (left) { addstr = "+"; }else if (right) { addstr = "-"; }else{ addstr = ""; } bw.write(String.format("%04d", lineNumber) + ":" + addstr + " " + s + "\r\n"); lineNumber++; } br.close(); bw.close();
tuka

2022/07/03 01:20

ありがとうございます、うまくいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問