2017-05-02 21 views
0

私は、高校のソフトウェアプロジェクトのためのフラッシュカードを作成しています。私は単語とそのそれぞれの翻訳をファイルに書き込んで保存することができますが、2次元配列に読み込む方法があるのだろうかと思っていました。.txtファイルから読み込んだ文字列を配列に入力する

コンマまたは他の文字で区切ることはできますか?

また、単語とそのそれぞれの翻訳をリンクする方法があります。たとえば、単語 'x'を呼び出した場合、配列に含まれている場合、 'translated x'という単語を呼び出す関数はありますか?

ありがとうございます!

答えて

0

問題を少し解説しましょう。

  • ファイル
  • wordtranslation
  • ストアデータ構造内wordtranslation(マップを用いて、約@Glenピアースの提案が良好であると決定するために、ファイル内の各行を解析読み取ります1)

我々は(これも私のスペイン語の語彙の範囲である)単語と翻訳を区切るために、カンマを使用し、私たちのファイルは次のようになりましょう:

hello,hola 
good,bueno 

ここでいくつかのコードをマップに読み込みましょう。

// a map of word to translation 
Map<String, String> wordMap = new HashMap<String, String>(); 

// a class that can read a file (we wrap the file reader in a buffered reader because it's more efficient to read a file in chunks larger than a single character) 
BufferedReader fileReader = new BufferedReader(new FileReader("my-file.txt")); 

// a line from the file 
String line; 

// read lines until we read a line that is null (i.e. no more lines) 
while((line = fileReader.getLine()) != null) { 
    // split the line, returns an array of parts 
    String[] parts = line.split(","); 

    // store the parts in meaningful variables 
    String word = parts[0]; 
    String translation = parts[1]; 

    // now, store the word and the translation in the word map 
    wordMap.put(word, translation); 
} 

// close the reader (note: you should do this with a try/finally block so that if you throw an exception, you still close the reader) 
fileReader.close(); 

は、だから今、私たちは、ファイル内のすべての単語と翻訳を持つマップを持っています。私は、次のステップは、ユーザーがあなたの言葉を与え、あなたは正しい翻訳を返すために持っていると思い

hello translates to hola 

String word = "hello"; 
String translation = wordMap.get(word); 
System.out.println(word + " translates to " + translation); 

が出力:単語を考えると、あなたは、このような翻訳を取得することができます。私はあなたにそれを残すでしょう。

+0

本当にありがとう、役に立ったただの迅速なフォローアップの質問。読書セクションを構成した方法は、一度に1組の単語しか保存できないのですか、それともすべて保存できますか?これは本当に私のプロジェクトには適用されませんが、私は知りたいだけです。再度、感謝します!! :D –

+0

もちろん、問題ありません。読み込みセクションはファイル全体を一度に1行ずつ読み込み、各行から 'word、translation'ペアを抽出し、そのペアを' wordMap'に格納します。したがって、ループの反復ごとに1つのペアしか格納されませんが、ファイル内のすべての行にループします。それはあなたの質問に答えますか? – Matt

+0

これは一度に1つのペアを格納し、whileループの終わりには、すべてのペアを同時に格納するでしょうか?お待ちいただいてありがとうございます。私はこれでかなり新しいです。 –

1

あなたは地図を見たいかもしれません。そうすれば、配列全体を繰り返し処理するのではなく、単語自体で各単語を検索することができます。マップはキー値のペアを使用します。残念ながら、それらは独占的です(あなたはその価値によって鍵を検索することはできません)。 https://docs.oracle.com/javase/7/docs/api/java/util/Map.html

+0

こんにちは。答えをありがとう。私は地図を見ましたが、ユーザが自分の言葉を入力できるようにする方法を見つけることができませんでした。これを行う方法はありますか? –

+0

プログラミングの素晴らしい世界へようこそ!ユーザーに入力を求めるのはMapの仕事ではありません。マップは、プログラムの残りの部分を隠して再度参照するためのツールに過ぎません。ユーザーが単語を追加できるようにするには、ユーザーに単語を入力するように指示するコードを作成し、ユーザーに翻訳の入力を依頼し、その回答を受け入れ、その単語をマップに保存する必要があります。次に、単語を入力し始めたい、クイズを始める、などを指定する手段をユーザに提供する必要があります。心配しないで、楽しいでしょう! –

+0

私はそれを理解していますが、ユーザーが入力した単語をマップにリンクさせる方法と、ユーザーが単語を入力したときに新しいマップを作成する方法はわかりません... –

0

単語をテキストファイルに保存する必要がありますか(永続化する必要がありますか)、またはそれらをメモリに保存できますか?彼らは、テキストファイルに書き込む必要がある場合は 、これを試してみてください。私はその翻訳から単語を分離するためのスペースを使用しています

// Create a file 
    File file = new File("file.txt"); 
    // Initialize a print writer to print to the file 
    PrintWriter pw = new PrintWriter(file); 
    Scanner keyboard = new Scanner(System.in); 

    // Populate 
    boolean stop = false; 
    do { 
     String word; 
     String translation; 
     System.out.print("Enter a word: "); 
     word = keyboard.nextLine().trim() + " "; 
     if (!word.equals("quit ")) { 
      pw.print(word); 
      System.out.print("Enter its translation: "); 
      translation = keyboard.nextLine().trim(); 
      pw.println(translation); 
     } else { 
      stop = true; 
     } 
    } while (!stop); 

    // Close the print writer and write to the file 
    pw.close(); 

    // Initialize a scanner to read the file 
    Scanner fileReader = new Scanner(file); 

    // Initialize a hash table to store the values from the file 
    Hashtable<String, String> words = new Hashtable<String, String>(); 

    // Add the information from the file to the hash table 
    while (fileReader.hasNextLine()) { 
     String line = fileReader.nextLine(); 
     String[] array = line.split(" "); 
     words.put(array[0], array[1]); 
    } 

    // Print the results 
    System.out.println("Results: "); 
    words.forEach((k, v) -> System.out.println(k + " " + v)); 

    fileReader.close(); 
    keyboard.close(); 

注意を。カンマやセミコロンを簡単に使うことができます。 line.split(" ")line.split(< your separating character here>)に置き換え、末尾を連結してword = keyboard.nextLine().trim()の末尾に連結します。

あなたが情報を保存する必要があり、ちょうど、ユーザーの入力を収集する必要がない場合は、それも簡単です:

Scanner keyboard = new Scanner(System.in); 

    // Initialize a hash table to store the values from the user 
    Hashtable<String, String> words = new Hashtable<String, String>(); 

    // Get the input from the user 
    boolean stop = false; 
    do { 
     String word; 
     String translation; 
     System.out.print("Enter a word: "); 
     word = keyboard.nextLine().trim(); 
     if (!word.equals("quit")) { 
      System.out.print("Enter its translation: "); 
      translation = keyboard.nextLine().trim(); 
      words.put(word, translation); 
     } else { 
      stop = true; 
     } 
    } while (!stop); 

    // Print the results 
    System.out.println("Results: "); 
    words.forEach((k, v) -> System.out.println(k + " " + v)); 

    keyboard.close(); 
関連する問題