Печать отдельных слов без повторения?

Я хочу перечислить каждое уникальное слово в текстовом файле и сколько раз каждое слово встречается в нем. Я пытался использовать цикл if, но не знаю, как удалить уже перечисленные слова после их подсчета.

for (int i = 0; i < words.size(); i++) {
    count = 1;
    //Count each word in the file and store it in variable count 
    for (int j = i + 1; j < words.size(); j++) {
        if (words.get(i).equals(words.get(j))) {
            count++;
        }

    }
    System.out.println("The word " + words.get(i) + " can be 
    found " + count + " times in the file.");
}

Содержимое текстового файла «Hello world. Hello world.», и программа напечатает следующее: The word Hello can be found 2 times in the file. The word world can be found 2 times in the file. The word Hello can be found 1 times in the file. The word world can be found 1 times in the file.

что за тип words?

Ali Ben Zarrouk 20.04.2019 18:44

Возможный дубликат Как посчитать количество вхождений каждого слова?

AxelH 20.04.2019 18:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
103
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете сделать это:

public void printWordOccurence(String filePath) throws FileNotFoundException {
        if (filePath.isEmpty())
            return;

        File file = new File(filePath);
        Scanner input = new Scanner(file);
        HashMap<String, Integer> wordOccurence = new HashMap<>();


        while (input.hasNext()) {
            wordOccurence.merge(input.next(), 1, Integer::sum);
        }

        for (String word : wordOccurence.keySet()) {
            System.out.println(word + " appears " + wordOccurence.get(word) + " times");
        }
    }

вместо того, чтобы писать if-else в цикле while, вы можете использовать метод merge интерфейса Map, представленный в Java 8.

Michał Krzywański 20.04.2019 18:52

теперь вы можете использовать ссылку на метод Integer::sum вместо (val1, val2) -> val1 + val2 :)

Michał Krzywański 20.04.2019 19:02

Я бы предложил использовать HashMap для решения этой проблемы. Проще говоря, HashMap — это пара ключ-значение, которая хеширует ключи и имеет сложность поиска O(1).

Повторите список слов только один раз и продолжайте сохранять найденное слово в HashMap. когда вы встречаете слово, проверьте, существует ли оно уже в HashMap. Если он не существует, добавьте его на карту с ключом как само слово и значением как 1. если слово уже существует, увеличьте значение на 1.

После завершения итерации HashMap будет содержать пары ключевых значений уникальных слов и их количество !!

на всякий случай если вы не в курсе про карты в java - https://www.javatpoint.com/java-хэшкарта

Ответ принят как подходящий

Вам нужно использовать ArrayList для хранения уже найденных слов, а после этого вам нужно проверить каждое слово в файле, присутствует ли оно в ArrayList или нет. Если слово присутствует внутри ArrayList, вам нужно игнорировать это слово. В противном случае добавьте это слово в ArrayList. Пример кода для вас:

ArrayList<String> found_words=new ArrayList<String>();
public static void main(String arguments[])
{
    String data = ""; //data from your file
    String[] words=data.split("\\s"); //split the string into individual words
    for(int i=0;i<words.length;i++)
    {
        String current_word=words[i];
        if (!is_present(current_word))
        {
            found_words.add(current_word);
            int count=1;
            for(int j=i+1;j<words.length;j++)
            {
                if (words[j].equals(words[i]))
                    ++count;
            }
            System.out.println("The word "+current_word+" can be found "+count+" times in the file.");
        }
    }
}
static boolean is_present(String word)
{
    for(int i=0;i<found_words.size();i++)
    {
        if (found_words.get(i).equals(word))
            return true;
    }
    return false;
}

Другие вопросы по теме