2017-10-24 4 views
2

私はJavaプログラミングの新人です。私はちょうど学校で課題を持っています。少し苦労しています。下記のコードは、編集できる唯一のコードです。ArrayListを更新するには?

txtファイルで "ADJEKTIV"という単語を検索し、形容詞のみを含む別のtxtドキュメントのランダムな形容詞に置き換えることです。この部分は私が釘付けだと思う​​。しかし、私がOutputWriterと呼ばれる別のクラスの書き込みメソッドを使用しようとすると、新しい更新を "ADJEKTIV"を含む文字列に使用しないようです。変更を保存するために何とかArrayListを "更新"する必要がありますか?

import java.util.*; 
/** 
* Class documentation needed! 
*/ 
public class StoryCreator 
{ 
    private InputReader reader; 
    private OutputWriter writer; 
    private Random random; 

    public StoryCreator() 
    { 
     reader = new InputReader(); 
     writer = new OutputWriter(); 
     random = new Random(); 
    } 

    public String randomAdjective(String adjectivesFilename) 
    { 
     ArrayList<String> adjectives = reader.getWordsInFile(adjectivesFilename); 

     int index = random.nextInt(adjectives.size()); 
     return adjectives.get(index); 

    } 

    public void createAdjectiveStory(String storyFilename, String adjectivesFilename, String outputFilename) 
    { 

     ArrayList<String> story = reader.getWordsInFile(storyFilename); 


     for(String s : story) 
     { 
      if(s.contains("ADJEKTIV.")) 
      { 
       s = randomAdjective(adjectivesFilename) + ". "; 
      } 

      if(s.contains("ADJEKTIV")) 
      { 
       s = randomAdjective(adjectivesFilename); 
      } 


     } 

     writer.write(story, outputFilename); 



    } 
} 

この

はOutputWriterクラスからメソッドです:

public void write(ArrayList<String> output, String filename) 
    { 
     try { 
      FileWriter out = new FileWriter(filename); 
      for(String word : output) { 
       out.write(word + " "); 
      } 
      out.close(); 
     } 
     catch(IOException exc) { 
      System.out.println("Error writing output file: " + exc); 
     } 

    } 
+1

あなたはリストを更新していません。 's = ...'は新しい 'String'を再インスタンス化します。これは' List'のインスタンスではなくなったので、その値をリストに設定する必要があります。そのためには、インデックスを把握する必要があります。 – AxelH

+0

[ArrayList.set()](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set(int、%20E)) –

+0

ありがとうございました!私はそれがそれのようなものかもしれないと思った!私はコードを書き直そうとします! –

答えて

2

あなたが新しいStringインスタンス化

s = randomAdjective(adjectivesFilename); 

でリストを更新していない、これは、インスタンスではなく、 List

この値をリストに設定する必要があります。そのためには、インデックスを追跡し、特定の場所でリストを更新するにはList.set(int, E)を使用する必要があります。

あなたのレベルで一番簡単です。ループを変更します。

for(int i = 0; i < story.size(); i++){ 
    String s = story.get(i); 

    if(s.contains("ADJEKTIV.")) 
    { 
     //replace the value with a new one. 
     s = randomAdjective(adjectivesFilename) + ". "); 
     story.set(i, s); 
     /* OR shorter 
     story.set(i, randomAdjective(adjectivesFilename) + ". "); 
     */ 
    } 

    ... 
} 
+0

ありがとうございました!それはそれを解決しました! –

+0

歓迎です@ s.sand93、Javaで楽しい;) – AxelH

0

代わりのArrayListのを反復処理、あなたも一度でReplaceAll方法を使用してのすべての出現を置き換えることができます。

public void createAdjectiveStory(String storyFilename, String adjectivesFilename, String outputFilename) 
{ 

    ArrayList<String> story = reader.getWordsInFile(storyFilename); 
    story.replaceAll(new UnaryOperator<String>() { 
    public String apply(String original) { 
     if(original.contains("ADJEKTIV.")) 
      return randomAdjective(adjectivesFilename) + ". "; 
     if(original.contains("ADJEKTIV")) 
      return randomAdjective(adjectivesFilename); 
     return original; 
    } 
}); 

    writer.write(story, outputFilename); 
} 
+1

あなたは、フォントインターフェイスを使用するためにラムダを使用する必要があります;)これは、短絡し、クリーナーです。また、すべてのインスタンスを更新していることに注意してください。元のコードの条件が不足しています。 'story.replaceAll(s - > s.contains(" ADJEKTIV。 ")?randonAdjective(...):s);' – AxelH

関連する問題