如何将文件中的单词存储到字符串中,然后反向打印出来?

时间:2014-03-04 18:06:03

标签: java arrays file bufferedreader

所以我需要完全按照标题中的说法进行操作,取一个名为“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);
      }
   }
}

4 个答案:

答案 0 :(得分:2)

您可以使用新的Files API和StringBuilder轻松完成此操作以反转您的String。它会显着减少你的代码行。

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

答案 1 :(得分:0)

尝试使用StringTokenizer读取该行。

http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

 StringTokenizer st = new StringTokenizer("this is a test");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }

答案 2 :(得分: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而不用担心长度:< / p>

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

但是,这确实闻起来像家庭作业,所以也许你出于某种原因需要使用String[]


最后,您在问题中所写的内容与您的计划的目标之间存在差异。您声称需要每个字词的列表,但它看起来更像是您尝试创建每个的列表。如果您需要单词而不是行,则需要拆分每一行并将每个标记添加到列表中。

答案 3 :(得分: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);
        }
    }

}