2016-04-19 4 views
1

このJavaコードはコンパイルされます。しかし、私がこのプログラムを実行したとき、それは本当に長い時間続いて、何の結果も得ていませんでした。そして最後にrunofoutspaceと言って、無限ループに陥ったと思います。あなたが実際にforループ内で、ArrayListのサイズを増加しているファイルを読み込んで作成しようとすると無限ループになる

for (int i=0; i<readFile.size();i++) 
    { 
    String n = readFile.get(i); 
    n = n.replaceAll(findWord,replaceWord); 
    readFile.add(i,n); 
    } 

:で

import java.util.*; 
import java.io.*; 
public class Exercise3{ 
public static void main (String[] args){ 
File infile = new File(args[0]); 
File outfile = new File("Ex3.txt"); 
try { 
    Scanner scan = new Scanner(infile); 
    ArrayList<String> readFile = new ArrayList<String>(); 
    String findWord = args[1]; 
    String replaceWord = args[2]; 

    while(scan.hasNextLine()) 
    { 
    readFile.add(scan.nextLine()); 
    } 
    //System.out.println(readFile); 
    for (int i=0; i<readFile.size();i++) 
    { 
    String n = readFile.get(i); 
    n = n.replaceAll(findWord,replaceWord); 
    readFile.add(i,n); 
    } 

    PrintWriter output = new PrintWriter(outfile); 
    for (int i=0; i<readFile.size();i++) 
    { 
    output.println(readFile.get(i)); 
    } 
    output.close(); 
    scan.close(); 
} 
catch (FileNotFoundException e){ 
    System.err.println("file not found."); 
} 


    } 
} 
+0

入力の検索を停止する必要があることをプログラムがどのように認識していますか? –

答えて

2

問題があります。 readFile.add(i、n);。 readFileのサイズは、ループの各反復で増分されるため、ループ条件は決してfalseに評価されません。

インデックスiに新しい要素を追加すると、インデックスの元の要素が右にシフトされます。それは置き換えられません。

+2

彼は実際には '.add'の代わりに' .set'を呼び出す必要があります – Ferrybig

0

新しいファイル/パスAPIを使用すると、そのタスクを少しシンプルに行うことができます。 実際の見通しはaddの使用でした。

Path infile = Paths.get(args[0]); 
Path outfile = Paths.get("Ex3.txt"); 
String findWord = args[1]; // Maybe Pattern.quote(args[1]) 
String replaceWord = args[2]; 

Charsetch charset = Charset.defaultCharset(); // StandardCharsets.UTF_8; 
List<String> lines = Files.readAllLines(inFile, charset); 
for (int i = 0; i < lines.size(); ++i) { 
    lines.set(i, lines.get(i).replaceAll(findWord, replaceWord)); 
} 
Files.write(outFile, lines, charset); 
関連する問題