0

说我的输入是

现在是
所有好人来帮助党的时候了

输出将是:

时间是现在
党的援助来男人好一切

我想出了如何反转整个文本文件,但我需要逐句进行。目前我的代码正在输出这个:

派对的援助来男人好一切都是现在

代码是:

List<String> words = new ArrayList<String>();

while(sc.hasNextLine())
{
String line = sc.nextLine();
StringTokenizer st = new StringTokenizer(line);
while(st.hasMoreTokens())
{
words.add(st.nextToken());
}
}
for (int i = 0; i <words.size(); i++)
{
System.out.print(words.get(words.size()-i-1) + " ");
}
4

3 回答 3

2

如果您使用类的split()方法String来分割一条线,它会更简单,它是按空格分割的首选方式(而不是 using ,这在所有实际用途中都StringTokenizer被认为已弃用)。此外,每行结束后换行都会出现问题 - 事实上,您应该使用列表列表,其中每个列表包含单行的单词。试试这个:

List<List<String>> words = new ArrayList<List<String>>();

while (sc.hasNextLine()) {
    String line = sc.nextLine();
    words.add(Arrays.asList(line.split("\\s+")));
}

for (List<String> list : words) {
    for (int i = list.size()-1; i >= 0; i--)
        System.out.print(list.get(i) + " ");
    System.out.println();
}
于 2012-11-23T00:46:53.893 回答
1

您需要做的就是将 print 语句移到 while 循环中,并清除单词 ArrayList。这将在移动到下一行之前打印出每个句子,并确保列表清晰以开始存储下一个句子。

while(sc.hasNextLine())
{
  String line = sc.nextLine();
  StringTokenizer st = new StringTokenizer(line);
  while(st.hasMoreTokens())
  {
    words.add(st.nextToken());
  }
  for (int i = 0; i <words.size(); i++)
  {
    System.out.print(words.get(words.size()-i-1) + " ");
  }
  words.clear();
}
于 2012-11-23T00:40:19.610 回答
1

将声明移动到words循环内 - 将其放在声明之后StringTokenizer。这将确保您每次阅读新句子时都会重新初始化单词列表。

于 2012-11-23T00:41:21.637 回答