【问题标题】:For each loop in Java with word count对于 Java 中的每个循环,有字数
【发布时间】:2015-12-03 17:58:33
【问题描述】:

我有一个长文本,存储在 String 中(即tstr1 im 代码)。现在我想将来自控制台的用户输入存储在String[](即itemsFromArray im 代码)中。

我希望对于存储在用户输入 String[] 数组中的每个单词,系统显示该单词在长 Text String[] 数组中出现的次数。我尝试过这种方式,但问题是系统只显示数组中第一个条目的计数,而下一个则显示为零。

  btnNewButton.addActionListener( new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            keyW = txtKeyword.getText();
            search = textField.getText();
            System.out.println("String for car = " + search); 
            System.out.println("String keyword = " + keyW); 

        WebDriver driver = new FirefoxDriver();
        driver.get("https://en.wikipedia.org/wiki/" + search);
        tstr1 = driver.findElement(By.xpath("//*[@id='content']")).getText();

        String [] itemsFromArray = keyW.split(",");  
        Map<String, Integer> map = new HashMap<String, Integer>();
        for (String word : itemsFromArray){
            map.put(word, 0);
        }
         Scanner s = new Scanner(tstr1);
        while (s.hasNext()){
            String word = s.next();
            if (map.containsKey(word)){
                map.put(word, map.get(word) + 1);
                System.out.println("Word1 '" + word + "' count:" + map.get(word));
            } else {
                System.out.println("Word2 '" + word + "' not in map");
            }
        }

        driver.close();  
        }   
    }); 

【问题讨论】:

  • 您可能想使用Map&lt;String, Integer&gt;(字数->计数)。
  • 遍历输入字符串并将计数(每个单词)存储在一个映射中,其中单词是键,值是计数。
  • 我不太明白如何做到这一点,请您详细解释一下。谢谢!!!
  • @DanPaschevici 我添加了一些基本代码。它没有经过测试,但它应该能让你继续前进。让我知道它是否有错误。
  • 如果你想超级高效,可以使用专为解决这个问题而设计的Aho-Corasick algorithm

标签: java arrays string for-loop foreach


【解决方案1】:

使用Map&lt;String, Integer&gt; 可能会更好:

// initialize a mapping that is used to map words to their count   
Map<String, Integer> counter = new HashMap<String, Integer>();

// initialize all counts to 0
for (String word : itemsFromArray){
    counter.put(word, 0);
}

// ...

// count words that are in map (give up those that aren't)
while (s.hasNext()){
    String word = s.next();
    if (counter.containsKey(word)){
        counter.put(word, counter.get(word) + 1);
        System.output.println("Word '" + word + "' count:" + counter.get(word));
    } else {
        System.output.println("Word '" + word + "' not in map");
    }
}

【讨论】:

  • 亲爱的Sharabani,它显示了其他任何内容,但我设置的关键字没有显示。但我在while 上面添加了Scanner s = new Scanner(tstr1);
  • 它不是用来处理初始化的,只是告诉你如何使用映射来计算单词。我把范围之外的所有东西都放在了外面。
  • 看,该文本中的每个单词都显示,包括我数组中的第一个关键字,如何只显示数组中的所有关键字???
  • 将您的尝试添加到您的问题中
  • 我不明白问题出在哪里。您可以添加您希望看到的输出吗?
【解决方案2】:

用了一天后,问题是当我尝试分隔字符串(不带逗号)并插入数组时,第一个字符串很好,但下一个字符串以空格开头,系统无法识别该单词。

    btnNewButton.addActionListener( new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            //If the button UPLOAD was not pressed we should to clear the ArrayList
            listKeys.clear();
            //////////////////////////////////////////////

            if(textField.getText().equals("")) {

                JOptionPane.showMessageDialog(null,"Make sure you enter at least one search key"); 

            }

       else if (txtKeyword.getText().equals("")) {

           System.out.println("String is NULL ");

           JOptionPane.showMessageDialog(null,"Add at least one keyword"); 
       } else {

            keyW = txtKeyword.getText();
            search = textField.getText();
            System.out.println("String for car = " + search); 
            System.out.println("String keyword = " + keyW); 

        WebDriver driver = new FirefoxDriver();
        driver.get("https://en.wikipedia.org/wiki/" + search);
        tstr1 = driver.findElement(By.xpath("//*[@id='content']")).getText();

        String [] items = keyW.split(","); 
        String [] itemsFromArray = new String[items.length];
        for ( int i = 0; i <  items.length; i++)
        {
            itemsFromArray[i] = items[i].trim();
        }
            for(String string : itemsFromArray)
        {       
            //if (args[i].toLowerCase().startsWith(­ "from:" )) 

            System.out.println("FOREACH " + string);
            int i = countWords(tstr1, string);
            System.out.println("Word count "+ string + ":  " + i);
            Keyword1 = ("Count for word " + string + " are " + i);
            listKeys.add(Keyword1);
        }
    driver.close();   
    }   

        }




private static int countWords(String tstr1, String string)
    {   
        int i = 0;
        Scanner s = new Scanner(tstr1);

        while (s.hasNext()) 
        {
            if (s.next().equals(string)) 
                i++;

        }

        return i;
    }
}

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多