2014-03-04 82 views
-3

因此,我需要完全按照标题中的说明进行操作,取一个名为“words.txt”的文本文件,让程序读取它,取出所有单词并将它们存储到数组中。之后,程序需要随机挑选一个,然后反向打印。让它工作起来很麻烦,因为它最终总是崩溃。这是我走到这一步:如何将文件中的单词存储到字符串中,并将它们反向打印出来?

import java.io.*; 
import java.util.Random; 

public class wordReader{ 
    public static void main (String args[]) throws Exception{ 
     BufferedReader br = new BufferedReader(new FileReader("words.txt")); 
     String strLine; 
     String[] filearray; 
     filearray = new String[10]; 

     while ((strLine = br.hasNextLine())) { 
     for (int j = 0; j < filearray.length; j++){ 
      filearray[j] = br.readLine(); 
      System.out.println(filearray); 
     } 
     } 
    } 
} 

好吧,这个我什么,我都在时刻:

import java.io.*; 
import java.util.Random; 

public class wordReader{ 
    public static void main (String args[]) throws Exception{ 
     BufferedReader br = new BufferedReader(new FileReader("words.txt")); 
     String strLine; 
     String[] filearray; 
     filearray = new String[10]; 
     int j = 0; 
     int i = 0; 
     Random r = new Random(); 
     while(((strLine = br.readLine()) !=null) && j < filearray.length){ 
     filearray[j++] = strLine; 
     int idx = r.nextInt(filearray.length); 
     } 
    } 
} 
+2

**准确**你的错误是什么?如果您不告诉我们发生了什么问题,我们无法帮助您。 –

+0

这甚至没有编译。 –

+0

关于如何反转字符串的这么多问题在这里弹出... – RacerNerd

回答

2

为此,您可以轻松地使用新的API Files和StringBuilder的扭转你的字符串。它会显着减少你的代码行数。

public static void main(String[] args) throws Exception { 
    Path path = Paths.get("words.txt"); 
    Charset charset = StandardCharsets.UTF_8; 

    String content = new String(Files.readAllBytes(path), charset); 
    String[] words = content.split(",|\.|\s+"); 

    int randomIndex = new Random().nextInt(words.length); 
    String word = words[randomIndex]; 

    String reversed = StringBuilder(word).reverse().toString(); 
    System.out.println(reversed); 
} 
+0

我该输入什么? – JasonBreen

+0

这会打印文件的全部内容,但是会颠倒过来,它不是提问者想要的内容。 –

+0

哦对。修正了我的帖子。 – ktm5124

0

你似乎没有得到做随机指标选择或行反转的点,所以我不会在这里解决这个问题。在StackOverflow中有无数的重复,告诉你如何反转字符串。

目前,您正在收到编译错误,因为(除其他之外)您尝试使用不存在的方法(BufferedReader#hasNextLine()。看起来你是混合了一些其他的方法,你可能已经发现,如:

int j = 0; 
while ((strLine = br.readLine()) != null) { // Set strLine to the next line 
    filearray[j++] = strLine; // Add strLine to the array 
    // I don't recommend printing the whole array on every pass through the loop... 
} 

你会发现,我还拿出了自己内心的for循环,因为它只是设置的每一个元素的列表到每个迭代的最新行。我假设你想填充列表中的所有行。实际上,你也应该检查是否j在可接受的范围内,以及:

while (((strLine = br.readLine()) != null) && j < filearray.length) {...} 

需要注意的是现实,你几乎可以肯定会更好使用List来存储你的线条,让你可以只添加所有的线条到List而不用担心长度:

List<String> contents = new ArrayList<String>(); 
while ((strLine = br.readLine()) != null) { 
    contents.add(strLine); // Add strLine to the List 
} 

但是,这并闻起来像功课,所以也许你需要使用一个String[]无论出于何种原因。


最后,在你写的问题和你的程序看起来有什么不同之处。您声称您需要每个单词的列表,但看起来更像是您想要创建每个的列表。如果您需要文字而不是线条,则需要拆分每一行并将每个标记添加到列表中。

+0

那么,我会如何随机选择,并反向打印?我需要一个反向循环,不是吗? – JasonBreen

+0

不,不需要使用String [],我只是想让它工作。 – JasonBreen

+0

@Jason有很多方法可以做线反转和随机选择。一旦建立了行列表,请在数组中选择[随机索引](http://docs.oracle.com/javase/7/docs/api/java/util/Random.html),然后[向后循环该字符串](http://stackoverflow.com/q/2713655/2069350)。 –

0

很多方法来完成这一点。这是一个递归方法,当调用从返回堆栈弹出时打印。这是改编自Reversing Lines With Recursion Java

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.PrintWriter; 

public class ReverseLines { 

    public static BufferedReader input; 
    public static PrintWriter output; 

    public static void main(String[] args) throws Exception { 

     input = new BufferedReader(new FileReader("/tmp/words.txt")); 
     output = new PrintWriter(System.out); 
     reverse(input, output); 
     input.close(); 
     output.flush(); 
     output.close(); 

    } 

    public static void reverse(BufferedReader input, PrintWriter output) 
      throws Exception { 

     String line = input.readLine(); 
     if (line != null) { 
      reverse(input, output); 
      output.println(line); 
     } 
    } 

} 
相关问题