将对象添加到arraylist,除非它已经存在

时间:2016-10-10 10:06:31

标签: java arraylist

我应该通读一个文件,将所有新单词添加到一个arraylist,如果该单词已经在列表中,则增加一个计数器出现的次数。我读的文字很好,但是当它被添加到列表中时,它似乎忽略了它检查单词是否已经在列表中并添加相同单词的倍数的部分。我得到了什么:

阅读方法:

public void read(String text) throws Exception{
  File fileText = new File(text);
  Scanner in = new Scanner(fileText);
  while(in.hasNextLine()){
    newWord = new Word(in.nextLine());
    add(newWord.text);
    }
  }

添加到arraylist的方法

public void add(String text){
  for(Word o: wordList){
    if(wordList.contains(newWord.text){
      newWord.increaseCount();
    }else{
      wordList.add(newWord);  
     }
   }

非常感谢一些帮助,我完全不知道问题所在......

3 个答案:

答案 0 :(得分:0)

似乎newWord是您的自定义类的实例。你的wordlist应该是一个字符串列表而不是这个类型,因为你检查文本(我假设是一个字符串)。这就是为什么每个对象都被添加到列表中,因为你使用newWord-text检查实例地址。所以改变wordList.add(newWord); to wordList.add(newWord.text);

答案 1 :(得分:0)

使用for-each循环迭代它时,不能在结构上修改列表。

在文档中说明 -

  

结构修改是添加或删除一个或多个的任何操作   更多元素,或显式调整后备数组的大小;只是设定   元素的值不是结构修改

见这 -

In Java, can you modify a List while iterating through it?

答案 2 :(得分:0)

我猜,因为你没有包含Word类的代码。

以下是编写add方法的方法。您可以添加计数或添加新单词。我也假设单词的情况无关紧要。

public void add(String text){
    for (Word o: wordList) {
        if (o.getWord().equalsIgnoreCase(text) {
            o.increaseCount();
            return;
        }   
    }
    wordList.add(new Word(text.toLowerCase());
}

您的read方法只调用add方法。

public void read(String text) throws Exception{
   File fileText = new File(text);
   Scanner in = new Scanner(fileText);
   while (in.hasNextLine()) {
       add(in.nextLine().trim());
   }
   in.close();
}