Вывод слов, которые встречаются более одного раза из строки

#java #string

#java #строка

Вопрос:

Я пытаюсь найти и напечатать слова в строке, которая встречается более одного раза. И это почти работает. Однако я борюсь с небольшой проблемой. Слова a печатаются дважды, поскольку они встречаются дважды в предложении. Я хочу, чтобы они были напечатаны только один раз:

Это мой код:

 public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    String sentence = "is this a sentence or is this not ";
    String[] myStringArray = sentence.split(" "); //Split the sentence by space.

    int[] count = new int[myStringArray.length];
    for (int i = 0; i < myStringArray.length; i  ){
       for (int j = 0; j < myStringArray.length; j  ){
           if (myStringArray[i].matches(myStringArray[j]))
               count[i]  ;
           //else break;
       }
    }
    for (int i = 0; i < myStringArray.length; i  ) {
            if (count[i] > 1)
          System.out.println("1b. - Tokens that occurs more than once: "   myStringArray[i]   "n");
    }
}
  

}

Комментарии:

1. Лучшей идеей могло бы быть сохранение слов в хэше. Таким образом, вам нужно просмотреть предложение только один раз и просто создать список слов с подсчетами, что намного эффективнее.

2. Прочитайте о картах в Java. Ваш подход далек от оптимального, несмотря на то, что он нарушен.

Ответ №1:

Вы можете попробовать for (int i = 0; i < myStringArray.length; i =2) вместо этого.

Комментарии:

1. Это не работает. Если предложение было: «На этот раз все в порядке». Слово «this» по-прежнему проверяется дважды.

Ответ №2:

прерывание при первом совпадении, после увеличения. тогда это также не увеличит второе совпадение.

Комментарии:

1. Что, если бы было более 1 слова, которое повторяется дважды? (например, «Мне нравится думать, что я люблю мороженое».)

2. break выполняется только из самого внутреннего цикла. внешний цикл все еще выполняется.

3. Что, если бы одно и то же слово появилось 3 раза? Разве вы не хотели бы, чтобы count для этого слова было 3? Кроме того, поскольку цикл проходит через значения [0,0] -> [n-1, n-1] для [i, j], не будет ли совпадение для слова иногда само по себе? Вы бы не хотели прерываться сразу после того, как оно увидит себя правильным?

4. это было бы, не так ли? внешний цикл все еще выполняется, поэтому он будет увеличивать первое совпадение для каждого вхождения. но в любом случае, OP хотел знать только, какие слова встречались «более одного раза».

Ответ №3:

В вашем коде есть некоторые проблемы с этим.

Если вы заметили, ваш код будет просматривать список из n элементов n ^ 2 раза. Если слово встречается дважды. Вы увеличите значение количества каждого слова в два раза. Что вам нужно отслеживать, так это набор слов, которые вы уже видели, и проверьте, было ли замечено новое слово, с которым вы столкнулись, или нет.

Если бы у вас было 3 появления одного слова в вашем предложении, у вас каждое слово имело бы значение 3. 3 — это избыточные данные, которые не нужно хранить для каждого токена, а просто для слова.

Все это можно легко сделать, если вы знаете, как Map работает.

Вот реализация, которая будет работать.

 import java.util.HashMap;

public class Main {
    public static void main(String[] args) {

        String sentence = "is this a sentence or is this not ";
        String[] myStringArray = sentence.split("\s"); //Split the sentence by space.

        Map <String, Integer> wordOccurrences = new HashMap <String, Integer> (myStringArray.length);

        for (String word : myStringArray)
            if (wordOccurrences.contains(word))
                wordOccurrences.put(word, wordOccurrences.get(word)   1);
            else wordOccurrences.put(word, 1);

        for (String word : wordOccurrences.keySet())
            if (wordOccurrences.get(word) > 1)
                System.out.println("1b. - Tokens that occurs more than once: "   word   "n");
    }
}
  

Ответ №4:

Мы хотим найти повторяющиеся слова из входной строки. Итак, я предлагаю следующий подход, который довольно прост:

  1. Создайте экземпляр хэш-карты. Ключом (String) будет слово, а значением (Integer) — частота его появления.
  2. Разделите строку, используя метод split(«s»), чтобы создать массив, состоящий только из слов.
  3. Введите переменную ‘frequency’ целочисленного типа с начальным значением ‘0’.
  4. Выполните итерацию массива строк и после проверки частоты добавьте каждый элемент (или слово) в карту (если частота для этого ключа равна 0) или, если ключ (слово) существует, увеличьте частоту только на 1.
  5. Итак, теперь вы остаетесь с каждым словом и его частотой.

Например, если входная строка «Мы становимся грязными, поскольку эта земля становится загрязненной. Мы должны это остановить «.
Итак, карта будет
{ («Мы»,2), («являемся», 1), («получаем», 2), («грязный»,1), («как»,1), («это»,1), («земля»,1), («есть»,1), («загрязненный»., 1), («должен», 1), («остановить»,1), («это». ,1) }
Теперь вы знаете, каков следующий шаг и как его использовать. Я согласен с Каушиком.