2016-04-19 10 views
1

Dieser Java-Code wird kompiliert. Aber als ich dieses Programm laufen ließ, dauerte es eine sehr lange Zeit und brachte keine Ergebnisse, und schließlich sagte Runofoutspace, ich denke, es ist in eine Endlosschleife geraten, aber ich kann nicht verstehen warum.Unendliche Schleife beim Versuch, eine Datei zu lesen und zu erstellen

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

Wie weiß Ihr Programm, dass es aufhören muss, nach Eingaben zu suchen? –

Antwort

2

Die Frage ist, mit:

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

Sie tatsächlich die Größe der Arraylist erhöht wird, innerhalb der for-Schleife. readFile.add (i, n);. Die Größe von readFile wird bei jeder Iteration der Schleife inkrementiert, so dass die Schleifenbedingung niemals zu false ausgewertet würde.

Wenn Sie ein neues Element am Index i hinzufügen, wird das vorherige Element am Index nach rechts verschoben. Es wird nicht ersetzt.

+2

Er muss tatsächlich '.set' anstelle von' .add' aufrufen – Ferrybig

0

Diese Aufgabe kann mit der neueren Datei-/Pfad-API etwas einfacher erledigt werden. Der Überblick über den Kurs war die Verwendung von add - tatsächlich hinzufügen.

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);