2017-02-06 5 views
0

私は初心者であり、助けが必要です。私はテキストファイルを1行ずつ配列にスキャンしようとしていますが、1行は省略しています。私のテキストファイルには、私は彼が彼女はそれは私がこれをスキャンし、置く方法を作成したいテキストファイルを配列にスキャンして指定された1行を省略する

ある

ある

であるあなたが

ある

です(メソッドのパラメータとしてStringを入力することによって選択される)1行を例外として、配列に要素を追加します。その後、元のテキストファイルを消去し、作成された配列をその行(削除された行は1つもありません)に出力します。申し訳ありませんが、私は説明を吸う。

私はこれを試してみました:

public static void deleteLine(String name, String line) throws IOException { 
    String sc = System.getProperty("user.dir") + new File("").separator; 
    FileReader fr = new FileReader(sc + name + ".txt"); 
    Scanner scan = new Scanner(fr); 
    int n = countLines(name); // a well working method returning the number if lines in the file (here 5) 
    String[] listArray = new String[n-1]; 
    for (int i = 0; i < n-1; i++) { 
     if (scan.hasNextLine() && !scan.nextLine().equals(line)) 
      listArray[i] = scan.nextLine(); 
     else if (scan.hasNextLine() && scan.nextLine().equals(line)) 
      i--; 
     else continue; 
    } 
    PrintWriter print = new PrintWriter(sc + name + ".txt"); 
    print.write(""); 
    for (int i = 0; i < n-2; i++) { 
     print.write(listArray[i] + "\n"); 
    } 
    print.close() 
} 

私は、私が入力したときにエラーが見つかりません「ライン」を取得:deleteLine(「all_names」、「あなたがいる」という。)(all_namesは、ファイルの名前です)。私は問題がfor-loopにあると確信していますが、なぜこれがうまくいかないのか分かりません。 :(

//このコードは、結局働い//

を解決しました。答えてくれてありがとう!

public static void deleteLine(String name, String line) throws IOException{ 
    String sc = System.getProperty("user.dir") + new File("").separator; 
    FileReader fr = null; 
    fr = new FileReader(sc+name+".txt"); 
    Scanner scan = new Scanner(fr); 
    int n = LineCounter(name); 
    String[] listArray = new String[n-1]; 
    for (int i = 0; i < n-1; i++) { 
     if (scan.hasNextLine()) { 
      String nextLine = scan.nextLine(); 
      if (!nextLine.equals(line)) { 
       listArray[i] = nextLine; 
      } 
      else i--; 
     } 
    } 
    PrintWriter print = new PrintWriter(sc+name+".txt"); 
    print.write(""); 
    for(int i=0;i<n-1;i++){ 
     print.write(listArray[i]+System.lineSeparator()); 


    } 
    print.close(); 

} 
+0

コード規約上の注意:Javaメソッドでは、小文字で始まります。 –

答えて

0

あなたはラインを使い果たしているため、比較中にscan.nextLine()を2回読み込んでいます。

私はあなたがそこに「.TXT」を入れていないので、LineCounter(名前は)働く感じるこの1または類似

for (int i = 0; i < n; i++) { 
     if (scan.hasNextLine()) { 
      String nextLine = scan.nextLine(); 
      if (nextLine.equals(line)) { 
       listArray[i] = nextLine; 
      } 
     } 
    } 
+0

ありがとうございました!この正確なコードはうまくいきませんでしたが、私はそれを取り組み、自分が望むものを得ることができました。 – Alisa

0

あなたはStringオブジェクトを比較しているかを見てください。あなたがにequalsメソッドを使用する必要があります文字列オブジェクトが同一であれば、文字列のコンテンツを比較する。==!=のような演算子を使用すると、比較します。

equalsを正しく使用した後、nextLineの使い方を正しく見てください。それを確認してくださいJavadoc

+0

ありがとう、それも問題を引き起こす可能性がありますが、これを修正してもエラーは同じです。 (!scan.nextLine()に変更。等号(行)+下の感嘆符のない行) – Alisa

0

であなたのループを交換してください。 FilereaderオブジェクトとPrintwriterオブジェクト内のファイル名から ".txt"拡張子を削除して、動作するかどうか確認してください。通常、ウィンドウ内では、拡張子はファイル名の一部ではありません。

0

ここでは、わかりやすいコードを使用して、必要な操作を行うための(簡単な)ソリューションがあります。

また、 ループを複数回は避けて、代わりに1つのJava 8ストリームを使用してフィルタリングします。

public static void deleteLine(String name, String line) throws IOException { 
    List<String> lines = Files.readAllLines(Paths.get(name)); 
    lines = lines.stream().filter(v -> !v.equals(line)).collect(Collectors.toList()); 
    System.out.println(lines); 

    // if you want the String[] - but you don't need it 
    String[] linesAsStringArr = new String[lines.size()]; 
    linesAsStringArr = lines.toArray(linesAsStringArr); 

    // write the file using our List<String> 
    Path out = Paths.get("output.txt"); // or another filename you dynamically create 
    Files.write(out, lines, Charset.forName("UTF-8")); 
} 
+0

ありがとう!私は本当にすべての機能を理解していないので、今私のために少し複雑すぎる。しかし、この回答は今後の参考になるでしょう。 – Alisa

関連する問題