如何更新ArrayList?

时间:2017-10-24 13:09:37

标签: java arraylist

我是Java编程的新手,我刚刚在学校完成了一项任务,我正在努力学习。您在下面看到的代码是我允许编辑的唯一代码。

分配是在txt文件中找到单词“ADJEKTIV”,并用另一个仅包含形容词的txt文档中的随机形容词替换它。这部分我认为我钉了。但是当我尝试使用另一个名为OutputWriter的类的write方法时,似乎不会对包含“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-class的方法:

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

    }

2 个答案:

答案 0 :(得分:2)

您没有使用

更新列表
s = randomAdjective(adjectivesFilename);

您实施了新的String,这不再是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) + ". ");
        */
    }

    ...
}

答案 1 :(得分:0)

您也可以使用 replaceAll 方法替换所有出现的次数,而不是迭代ArrayList。

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