0

これが変更されたコードです。プログラムを実行すると動作しますが、期待どおりに動作しません。「add」と入力した後に入力した行が書き込まれない理由がわかりません。また、「show」と入力しても何も表示されませんでした。私は何かが欠けているようです:

import java.io.BufferedReader; 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.charset.Charset;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.List;

public class unfinished {

public static void main(String[] args) throws IOException {

    //String command;
    //int index = 0;

    Path path = FileSystems.getDefault().getPath("source.txt");
    List<String> list = loadList(path);

    try(Scanner sc = new Scanner(System.in)){
    //  System.out.print("Enter the Command: ");
       String[] input = sc.nextLine().split(" ");
       while(input.length > 0 && !input[0].equals("exit")){ 

           switch(input[0]){
           case "add" : addToList(input, list); break;
           case "remove" : removeFromList(input, list); break;
           case "show": showList(input, list); break;
        }
          }
          input = sc.nextLine().split(" ");

}

    saveList(path, list);

}

これは、ソートとクリアのための私の古いコードの一部です:

/** 
Collections.sort(MenuArray);
int i = 0;
for (String temporary : MenuArray) {
System.out.println(++i + ". " + temporary);
}
//clear
MenuArray.clear();
System.out.println("All objects have been cleared !");
*/

private static void saveList(Path path, List<String> list) throws IOException {
    // TODO Auto-generated method stub
           Files.write(path, list, Charset.defaultCharset(), 
              StandardOpenOption.CREATE, 
              StandardOpenOption.TRUNCATE_EXISTING);
        }


private static void removeFromList(String[] input, List<String> list) {
// TODO Auto-generated method stub

}


private static void showList(String[] input, List<String> list) {
    // TODO Auto-generated method stub

}

private static void addToList(String[] input, List<String> list) {
    // TODO Auto-generated method stub

}

private static List<String> loadList(Path path)  throws IOException {
    // TODO Auto-generated method stub
           return Files.readAllLines(path, Charset.defaultCharset());
}


}
4

3 に答える 3

2

一方では、switch ステートメントを使用して実際のメニュー プログラムとしてプログラムを作成することで、物事を単純化できます。例えば:

Path path = FileSystems.getDefault().getPath("jedis.txt");
List<String> list = loadList(path);

try(Scanner sc = new Scanner(System.in)){
   String[] input = sc.nextLine().split(" ");
   while(input.length > 0 && !input[0].equals("exit")){
      switch(input[0]){
         case "add" : addToList(input, list); break;
         case "show": showList(input, list); break;
      }
      input = sc.nextLine().split(" ");
   }
}

saveList(path, list);

スキャナーはリソース (System.in) を消費するため、スキャナーの周りで try ステートメントを使用することの重要性に注意してください。不要になったときにそのリソースを解放することが重要です。

ここで、アクションのロジックをメニューのレンダリングから分離しました。この方法では、メニュー アルゴリズムはそのことだけを気にすることができますが、すべてのアクション メソッドはそれ自体のアクションを気にすることができます。そのため、 でファイルを読み取ること、 でファイルをloadList保存することsaveList、 のリストに新しい要素を追加することなどについて心配することができますaddToList

さて、あなたの質問が暗示しているように、問題のファイルに単に文字列が含まれている場合。次のように、Java NIOを使用してそれを読むために本当に簡単なことをすることができます

public static List<String> loadList(Path path) throws IOException {
   return Files.readAllLines(path, Charset.defaultCharset());
}

そして、ファイルを書き戻すのは次のように簡単です。

public static void saveList(Path path, List<String> list) throws IOException {
   Files.write(path, list, Charset.defaultCharset(), 
      StandardOpenOption.CREATE, 
      StandardOpenOption.TRUNCATE_EXISTING);
}

または、他の回答が示唆しているように、BufferedReader や FileWriter などの従来の Java I/O クラスを使用できます。

-- 編集 1 --

リストから要素を削除したい場合は、メニューで別の操作をサポートするだけです。

switch(input[0]){
   case "add" : addToList(input, list); break;
   case "remove" : removeFromList(input, list); break;
   case "show": showList(input, list); break;
}

そして対応するアクションメソッドを実装します。たとえば、その削除アクションの場合、次のようになります。

public static void removeFromList(String[] input, List<String> list){
  if(input.length == 2 && input[1].matches("\\d+")){
      int index = Integer.parseInt(input[1]);
      if(index < list.size()){
         list.remove(index);
      } else {
         System.out.println("Invalid index: " + index);
      }
   } else {
      System.out.println("Invalid input: " + Arrays.toString(input));
   }
}

この場合、ユーザーは「remove 10」のようなコマンドを入力して、そのインデックスをリストから削除する必要があります。

ユーザーがどれを削除するかをより簡単に選択できるように、要素のインデックスを表示するような方法でリストを表示するメソッドを実装することができます。たとえば、show list メソッドは次のように表示する必要があります。

0. Obi-wan
1. Yodah
2. Luke
3. Anakin

-- 編集 2 --

ユーザー入力を読み取るために、次のようなメッセージを表示することができます: "Enter command (or type help for options): ".

明らかに、ユーザーの入力を で読み取る直前にこれを配置する必要がありますsn.nextLine()。これを 2 つの異なる場所で行っているため、このコードを 1 回だけ記述できるように、このためのメソッドを記述した方がよいでしょう。やや好き:

private String[] getComnand(Scanner sc) {
   System.out.println("Enter command (or type help for options): ");
   return sc.nextLine().split(" ");
}

これで、メニュー コードでこれを再利用できます。

また、ユーザーが間違ったコマンドを入力したり、ヘルプを入力したりするたびに、ユーザーが使用できるコマンドのリストを表示するようにメニューを修正することもできます。

switch(input[0]){
   case "add" : addToList(input, list); break;
   case "remove" : removeFromList(input, list); break;
   case "show": showList(input, list); break;
   default: showHelp(input);
}

このshowHelp()メソッドでは、おそらく使用可能なコマンドのリストを表示したいと思うでしょう。やや好き:

Available commands:

add <name>...........Adds the given name to the list
remove <index>.......Removes the item in the given index
show.................Displays all items and their indices
help.................Displays this help
于 2013-09-28T13:18:40.847 に答える
0

プログラムの開始時に、ファイルから配列リストを再構築します (存在する場合)。次に、必要なすべての操作を実行し、最後にコマンドが終了する場合は、内容をファイルに書き込んで終了します

于 2013-09-28T12:33:56.093 に答える