0

我在 java 中编写了一个字典,用户输入单词并按字母顺序存储在 .txt 文件中。当我单独使用 SortWords 方法时,它可以正常工作,但是当我将它与 Option1Method 结合使用时,它将单词添加到字典中,它就不起作用了。它就像它改变了文本文件的文件类型之类的?任何帮助将不胜感激

public static void Option1Method() throws IOException {
    FileWriter aFileWriter = new FileWriter("wordlist.txt", true);
    PrintWriter out = new PrintWriter(aFileWriter);
    String word = JOptionPane.showInputDialog(null, "Enter a word");

    out.println(word);
    out.close();

    aFileWriter.close();

    String inputFile = "wordlist.txt";
    String outputFile = "wordlist.txt";
    FileReader fileReader = new FileReader(inputFile);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String inputLine;
    List<String> lineList = new ArrayList<String>();
    while ((inputLine = bufferedReader.readLine()) != null) {
        lineList.add(inputLine);
    }
    fileReader.close();

    Collections.sort(lineList);

    FileWriter fileWriter = new FileWriter(outputFile);
    PrintWriter out1 = new PrintWriter(fileWriter);
    for (String outputLine : lineList) {
        out.println(outputLine);
    }
    out1.flush();
    out1.close();
    fileWriter.close();
}
4

1 回答 1

1

好的,因为我不能让这个问题得不到回答,这里有一个简单的例子,说明你如何使用一些内置类来做到这一点:

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

public class q15664563 {
  public static void main(String[] args) throws IOException {
    String wordlist = "wordlist.txt";
    if(args.length == 1 && args[0].toLowerCase().charAt(0) == 'l') {
      //List Words
      SortedSet<String> dictionary = load(wordlist);
      for(String word : dictionary) {
        System.out.println(word);
      }
    } else if(args.length == 2 && args[0].toLowerCase().charAt(0) == 'a') {
      //Add Word
      SortedSet<String> dictionary = load(wordlist);

      dictionary.add(args[1].toLowerCase());

      save(dictionary, wordlist);
    } else {
      System.err.println("Correct usage:");
      System.err.println(" q15664563 LIST       --lists all words");
      System.err.println(" q15664563 ADD [word] --adds word to list");
    }
  }

  private static void save(SortedSet<String> dictionary, String wordlist) throws IOException {
    FileWriter file = new FileWriter(wordlist);
    BufferedWriter writer = new BufferedWriter(file);

    for(String word : dictionary) {
      writer.append(word);
      writer.newLine();
    }

    writer.close();
    file.close();
  }

  private static SortedSet<String> load(String wordlist) throws IOException {
    SortedSet<String> dictionary = new TreeSet<String>();
    FileReader file = new FileReader(wordlist);
    BufferedReader reader = new BufferedReader(file);
    String word;

    while((word = reader.readLine()) != null) {
      dictionary.add(word);
    }

    reader.close();
    file.close();
    return dictionary;
  }
}

这段代码需要指出的一些事情,读取和写入是两个独立的操作,因此为了保持清洁,将它们放在自己的函数中会有所帮助(这当然是见仁见智)。此外,通常情况下,有一些数据类型会对您有所帮助,这TreeSet就是一个很好的例子。它实现了SortedSet接口,并且每次迭代 ti 时都是按字母顺序排列的(实际上每次插入它时它都是按字母顺序排列的,随着集合长度的增加要记住这一点)。鉴于此属性,如果您想优化,您可能只需要TreeSet在列表可能更改其字母顺序(插入时)时使用。列出时,您会逐行读取文件,知道它的顺序正确。如果你这样做了,那么你将不再有一个通用的load()您可以在这两种情况下使用的方法(在以设计简单性换取性能时要考虑的事情)。

于 2013-03-28T18:43:58.603 回答