Как вы рассчитываете количество уникальных слов из файла в java? [Дубликат]

Убедитесь, что sql_mode подобен

  sql_mode = NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES  

, если это так, измените на

  sql_mode = NO_ENGINE_SUBSTITUTION  

OR

перезагрузите ваш сервер, изменив файл my.cnf (следующее задание)

   innodb_large_prefix = on  
3
задан pratnala 20 March 2013 в 14:47
поделиться

6 ответов

Немного измененная версия других ответов (мне нравится это коротко и просто):

String[] words = str1.split("[!-~]* ");
Set<String> uniqueWords = new HashSet<String>();

for (String word : words) {
    uniqueWords.add(word);
}

Примечание: если вы хотите разделить на ! или - или ~ или пробел, вы должны использовать это:

String[] words = str1.split("[-!~\\s]+");

(черта должна быть первой или последней)

3
ответ дан assylias 17 August 2018 в 08:53
поделиться
  • 1
    У меня есть текстовый файл романа. Я хочу получить уникальные слова в романе. Очевидно, знаки препинания должны быть удалены. – pratnala 20 March 2013 в 14:08
  • 2
    ЕСЛИ вам нужны только правильные буквы, почему бы вам не разделить на буквы: str1.split("[\\W]+");? – assylias 20 March 2013 в 14:28
  • 3
    Я попробую и дам вам знать. Пожалуйста, оставайтесь в сети :) – pratnala 20 March 2013 в 14:38
  • 4
    Кстати, мне нужны слова, а не буквы. – pratnala 20 March 2013 в 14:42
  • 5
    @pratnala Да, это прекрасно - str1.split("[\\W]+"); даст вам слова (он будет разбивать строку каждый раз, когда находит небуквенный символ, например пунктуацию, пробел и т. д.). – assylias 20 March 2013 в 14:50

Я предлагаю вам использовать шаблон и сопоставление и отбросить результат в Set.

public void getWords()
{
    Set<String> words = new HashSet<String>();
    String pattern = "[a-zA-Z]+\\s";
    String match = "hello world how* are. you! world hello";
    Pattern compile = Pattern.compile(pattern);
    Matcher matcher = compile.matcher(match);
    while(matcher.find())
    {
        String group = matcher.group();
        boolean add = words.add(group);
        if(add)
        {
            System.out.println(group);
        }
    }
}

Выход:

hello 
world 

Измените свое определение того, что означает слово '- путем изменения шаблона.

0
ответ дан Deepak Bala 17 August 2018 в 08:53
поделиться
  • 1
    Но выход должен иметь hello world how are you – pratnala 20 March 2013 в 14:43
  • 2
    Это зависит от вашего определения того, что такое «слово». Обратите внимание, что на определенных словах есть специальные символы (например, *!). Если они не считаются словами, регулярное выражение выше или "\\ w + \\ s" должен соответствовать одному или нескольким символам слов, за которыми следует пробел. Я бы не стал рассматривать «как» & quot; словарное слово. Фрагмент кода выше должен решаться для любой входной строки. – Deepak Bala 20 March 2013 в 15:08
  • 3
    Но я беру на себя вход от романа. Так как * не произойдет в любом случае – pratnala 20 March 2013 в 15:10
  • 4
    Роман, да? Тогда становится немного сложнее. Используйте фрагмент кода выше, но настройте регулярное выражение, чтобы включить в него слова со следующими символами: '; ,: () $. , Они могут появляться в любом произвольном тексте. Примеры - «Не надо; 5 $; Он любит ее (не совсем); Приговор прекращается на определенный период. – Deepak Bala 20 March 2013 в 15:15
5
ответ дан Mariusz Jamro 17 August 2018 в 08:53
поделиться
2
ответ дан OldCurmudgeon 17 August 2018 в 08:53
поделиться

Set не позволяет дублировать, где List позволяет дублировать.

String[] words;
Set<String> uniqueWords = new HashSet<String>();
words = str1.split("[!-~]* ");
for (int i = 0; i < words.length; i++)
    uniqueWords.add(words[i]); //Here you need not to check with set because it wont allow duplicates
1
ответ дан PSR 17 August 2018 в 08:53
поделиться

Если вы хотите получить слова, которые не были дублированы в предложении / любом виде текста, вы можете попробовать следующее:

   public static Map<String,Integer> getUniqueWords(String sentence){
   String[] word = sentence.split("[\\W]+");
        Map<String,Integer> uniqueWord = new HashMap<>();
        for (String e:word){
            if(!uniqueWord.containsKey(e)){
                uniqueWord.put(e,1);
            }else{
                uniqueWord.remove(e);
            }
        }
        return uniqueWord;
    }
0
ответ дан Sam Abdul 17 August 2018 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: