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