Счетчик приращений, если объект существует в arraylist, иначе Добавьте объект в arraylist - PullRequest
0 голосов
/ 13 февраля 2020

Я читаю слова из текстового файла, а затем создаю новый объект Word для каждого слова и сохраняю объекты в ArrayList. Текст слова передается в объект в качестве параметра. Я переопределил equals(Object) и hashCode() метод слова класса, чтобы проверить равенство объектов на основе текста слова вместо места в памяти объекта. Я пытаюсь сохранить все уникальные слова в ArrayList как уникальные объекты и увеличивать вхождение объекта слова, если слово повторяется в текстовом файле.

Scanner file = new Scanner(new File(textfile));
ArrayList<Word> words = new ArrayList<Word>();
while (file.hasNext()) {

    Word w = new Word(fileWord);

    if (words.contains(w)) {
        w.increaseCount();
    } else {
        words.add(w);
    }
}

Класс слова равен;

public class Word {
    private String text;
    private int count;

    public Word(String wordText) {
        text = wordText;
    }

    public void increaseCount() {
        count += 1;
    }

    @Override
    public boolean equals(Object wordToCompare) {
        if (wordToCompare instanceof Word) {
            Word castedWord = (Word) wordToCompare;
            if (castedWord.text.equals(this.text)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        return text.hashCode();
    }
}

Уникальные слова добавляются к ArrayList, но мой счет не увеличивается. Как увеличить счетчик

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Проблема с этим утверждением в вашем коде;

while (file.hasNext()) {

    Word w = new Word(fileWord);

    if (words.contains(w)) {
        w.increaseCount(); // Here's what goes wrong.
    } else {
        words.add(w);
    }
}

Вы вызываете функцию increaseCount() для вновь созданного объекта, которая будет заменена во время следующей итерации, и вы потеряли ссылку , Но фактический объект находится в ArrayList, и вы должны увеличить значение этого объекта. Итак, я бы сказал, ваш код должен быть изменен так:

Scanner file = new Scanner(new File(textfile));
ArrayList<Word> words = new ArrayList<Word>();
while (file.hasNext()) {

    Word w = new Word(fileWord);

    if (words.contains(w)) {
        words.get(words.indexOf(w)).increaseCount(); // Note the change here.
    } else {
        w.increaseCount(); // This is for the first occurrence as 'count' is 0 initially.
        words.add(w);
    }
}
1 голос
/ 13 февраля 2020

Проверьте этот ответ:

    Scanner file = new Scanner(new File(textfile));
    ArrayList<Word> words = new ArrayList<Word>();
    while (file.hasNext()) {

        Word w = new Word(fileWord);

        if (words.contains(w)) {
            w.increaseCount();
            int index = words.indexOf(w);
            Word w1 = words.get(index);
            w1.increaseCount();
            words.set(index, w1);
        } else {
            words.add(w);
        }
    }
1 голос
/ 13 февраля 2020

Проблема в том, что вы создаете новый экземпляр Word в l oop. Когда массив содержит только что созданный Word, вы увеличиваете его количество, а не существующий экземпляр, который уже был добавлен в массив ранее. Рассмотрите возможность использования карты для решения проблемы, ключ - это слово, а значение - количество.

package example.stackoverflow;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WordCount {

    public static void main(String[] args) {
        List<String> sourceList = Arrays.asList("ABC", "XYZ", "HGK", "ABC", "PWT", "HGK", "ABC");

        Map<String, Integer> wordCount = new HashMap();

        for (String word : sourceList) {
            if (wordCount.get(word) != null) {
                wordCount.put(word, wordCount.get(word) +1);
            } else {
                wordCount.put(word, 1);
            }
        }

        System.out.println(wordCount);//output: {ABC=3, XYZ=1, PWT=1, HGK=2}
    }

}
...