0

ユーザーが単語を入力し、それらがアルファベット順に.txtファイルに保存されるJavaで辞書をコーディングしています。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;
  }
}

このコードで指摘すべきいくつかのことは、読み取りと書き込みは 2 つの別個の操作であるため、物事をきれいに保つために、それらを独自の関数に入れるのに役立ちます (これはもちろん意見の問題です)。また、よくあることですが、役立つデータ型がありTreeSet、その良い例です。これはインターフェイスを実装し、SortedSetti を反復するたびにアルファベット順になります (実際には、挿入するたびにアルファベット順になります。セットが長くなるにつれて覚えておく必要があります)。このプロパティを指定すると、最適化するTreeSet場合は、リストが (挿入時に) アルファベット順で変更される可能性がある場合にのみ使用する必要があります。リストするときは、ファイルが正しい順序であることがわかっているので、ファイルを 1 行ずつ読みます。これを行うと、ジェネリックはなくなりますload()両方のインスタンスで使用できる方法 (設計の単純さとパフォーマンスを交換する場合に考慮すべきこと)。

于 2013-03-28T18:43:58.603 に答える