2017-10-24 2 views
2

Ich bin neu in der Java-Programmierung und habe gerade eine Aufgabe in der Schule, mit der ich ein bisschen zu kämpfen habe. Der Code, den Sie unten sehen, ist der einzige Code, den ich bearbeiten darf.Wie aktualisiere ich die ArrayList?

Die Zuordnung ist das Wort „adjektiv“ in einer txt-Datei und ersetzen Sie es mit einem zufälligen Adjektiv von einem anderen txt-Dokument mit nur Adjektiven zu finden. Dieser Teil denke ich, dass ich genagelt habe. Aber wenn ich versuche, die Write-Methode von einer anderen Klasse namens OutputWriter zu verwenden, scheint es, als würde es die neuen Updates nicht zu den Strings bringen, die "ADJEKTIV" enthalten. Muss ich die ArrayList irgendwie "updaten", um die Änderungen zu behalten?

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); 



    } 
} 

Mit dieser Methode von der OutputWriter-Klasse ist:

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

Sie aktualisieren die Liste nicht. 's = ...' reinstanziiere einen neuen 'String', dies ist nicht mehr die Instanz in der' List', du musst diesen Wert in die Liste setzen. Dafür müssen Sie den Index verfolgen. – AxelH

+0

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

+0

Thank you! Ich dachte, es könnte so etwas sein! Ich werde versuchen, den Code neu zu schreiben! –

Antwort

2

Sie die Liste nicht aktualisiert mit

s = randomAdjective(adjectivesFilename); 

Sie instanziieren ein neues String, ist dies nicht der Fall in die List mehr.

Sie müssen diesen Wert in die Liste setzen. Dazu müssen Sie den Index verfolgen und List.set(int, E) verwenden, um die Liste an einem bestimmten Ort zu aktualisieren.

Die einfachste auf Ihrem Niveau. Ändern Sie die Schleife:

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

Vielen Dank! Das hat es gelöst! –

+0

Sie sind willkommen @ s.sand93, viel Spaß mit Java;) – AxelH

0

Statt Iterieren über die Arraylist, können Sie auch alle Vorkommen von einmal mit replaceAll Verfahren ersetzen kann.

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

Sie sollten ein Lambda verwenden, um die Schnittstelle fonction zu verwenden;) das wäre kurzgeschlossen und sauberer. Beachten Sie außerdem, dass Sie jede Instanz aktualisieren. Sie haben die Bedingung im ursprünglichen Code verpasst. 'story.replaceAll (s -> s.contains (" ADJEKTIV. ")? randonAdjektiv (...): s);' – AxelH