计算每个单词的重复次数

时间:2016-10-28 13:27:41

标签: java

我想编写一个代码,用于计算字符串中每个单词的重复次数,单词之间用一些输入为字符串的字符分开...为什么我的代码不起作用? 请尽快回答!

public class repeat {

public static void main(String[] args) {
    Scanner ss = new Scanner(System.in);
    System.out.println("Please write a string:");
    String s = ss.nextLine();
    System.out.println("Please write a character:");
    String w = ss.nextLine();
    int i = 0;
    int j = 0;
    int k = 0;
    int y=0;
    for (i=0 ;i < s.length() ;i++) {
        for (j = 0; j < w.length(); j++) {
            if (w.charAt(j) == s.charAt(i) && i!=y && i!=0 && i!=s.length() -1 ) {
                k += 1;
                y=i+1;
            }
        }
    }
    i = 0;
    j = 0;
    y = 0;
    int r = 0;
    k++;
    System.out.println(k);
   String[] a = new String[k];
    for (r=0 ;r < k-1 ;r++) {
        for (j=1 ;j < s.length() ;j++) {
            for (i = 1; i < w.length(); i++) {
                if (w.charAt(i) == s.charAt(j)) {
                    a[r] = s.substring(y, j);
                    y = j+1;
                }
            }
        }
        System.out.println(a[r]);
    }
    a[k-1] = s.substring(y+1,s.length());
    i = 0;
    int[] b = new int[k];
    while (i <k) {
        b[i] = 0;
        i++;
    }
    i = j = 0;
    while (i < k) {
        while (j != i && j < k) {
            if (a[i] == a[j]) {
                a[j] = null;
                b[i]++;
            }
            j++;
        }
        i++;
    }
    i = j = 0;
    while (i < k) {
        if (a[i] != null) {
            System.out.println(a[i] + " " + b[i]);
        }
        i++;
    }
}
}

4 个答案:

答案 0 :(得分:0)

查看代码,您需要花很长时间来解决此问题。最简单的方法是使用正则表达式https://docs.oracle.com/javase/tutorial/essential/regex/。请参阅以下方法。

public Sentence(String sentanceString) {        
    this.fullSentence = sentanceString;
    breakStringIntoWords(sentanceString);        
}

private void breakStringIntoWords(String sentanceString) {
    String[] wordsInString = sentanceString.split("\\W+");
    for (String word : wordsInString) {
        words.add(new Word(word));
    }
}

在第二种方法中,我将一个句子(由[spaces]分隔)打成了单词。从这里开始,您将编写代码来比较每个单词(具有to字符串方法的类,因此将其视为字符串)与Words数组列表中的每个其他单词进行比较,小心避免过度计数。

答案 1 :(得分:0)

(错误的语言我在c#中做错了 - 请参阅java的下一个答案)

我建议使用数组和Split,因为使用子字符串来查找char非常复杂。虽然w仍然是String,但c需要是char类型。

        String[] foundwords = { };
        Int32[] wordcount = { };

        foreach (String word in s.Split(w))
        {
            int IndexOfWord = Array.IndexOf(foundwords, word);
            if (IndexOfWord < 0)
            {
                Array.Resize(ref foundwords, foundwords.Length + 1);
                Array.Resize(ref wordcount, wordcount.Length + 1);
                foundwords[foundwords.GetUpperBound(0)] = word;
                wordcount[foundwords.GetUpperBound(0)] = 1;
            }
            else
            {
                wordcount[IndexOfWord]++;
            }
        }
        for (int i = 0; i <= foundwords.GetUpperBound(0); i++)
        {
            Console.WriteLine(String.Format("Found word '{0}' {1} times.", foundwords[i], wordcount[i]));
        }

请注意它区分大小写。

答案 2 :(得分:0)

好吧现在这是带有Split的Java,而不是手动搜索字符串: 我不确切地知道复制阵列是否是使其变大的最佳做法,但如果你的字符串不是兆字节,那么它就不会成为问题:

public class repeat
{
    public static void main(String[] args)
    {
        String s = "Hello world this is a very good test to a world just that contains just more words than just hello";
        String w = " ";

        String[] foundwords = new String[0];
        int[] wordcount = new int[0];
        String[] splittext = s.split(w);
        for (int i = 0; i< splittext.length; i++)
        {
            int IndexOfWord = getIndexOfWord(splittext[i], foundwords);
            if (IndexOfWord < 0)
            {
                String[] foundwordsTemp = new String[foundwords.length + 1];
                int[] wordcountTemp = new int[foundwords.length + 1];
                System.arraycopy(foundwords, 0, foundwordsTemp, 0, foundwords.length);
                System.arraycopy(wordcount, 0, wordcountTemp, 0, foundwords.length);
                foundwords = new String[foundwords.length + 1];
                wordcount = new int[wordcount.length + 1];
                System.arraycopy(foundwordsTemp, 0, foundwords, 0, foundwordsTemp.length);
                System.arraycopy(wordcountTemp, 0, wordcount, 0, foundwordsTemp.length);
                foundwords[foundwords.length-1] = splittext[i];
                wordcount[foundwords.length-1] = 1;
            }
            else
            {
                wordcount[IndexOfWord]++;
            }
        }
        for (int i = 0; i < foundwords.length; i++)
        {
            System.out.println(String.format("Found word '%s' %d times.", foundwords[i], wordcount[i]));
        }
    }
    private static int getIndexOfWord(String word, String[] foundwords)
    {
        for (int i = 0; i < foundwords.length; i++)
        {
            if (word.equals(foundwords[i]))
            {
                return i;
            }
        }
        return -1;
    }
}

答案 3 :(得分:0)

所以,如果它仍然在你的名单上,我就会制作一个代码。

首先 - 你失败了,只让它在主程序中运行。您应该开始并将您的工作分成单个任务,而不是编写一个海峡开始停止计划。使用&#34; good&#34;名称将使您将来更容易。

首先,您需要在另一个中找到字符串。

通常你可以使用

 int dividerPosition = restString.indexOf(searchString);

这是一个java build in function。如果你想自己编写,你可以创建一个这样的函数(它会做同样的但你可以&#34;看&#34;它工作:)

private static int indexOf(String restString, String searchString)
{
    int dividerPosition = -1;
    for (int i = 0; i < restString.length()-searchString.length(); i++)
    {
        // Debuging test:
        System.out.println(String.format("search Pos %d in '%s' for length %d.", i, restString, searchString.length()));
        if (restString.substring(i, i + searchString.length()).equals(searchString))
        {
            dividerPosition = i;
            i = restString.length();
        }
    }
    return dividerPosition;
}

稍后在您的代码中使用此函数,如:

int dividerPosition = indexOf(restString, searchString);

我将再次使用该功能查找已知的单词

private static int getIndexOfWord(String word, String[] foundwords)
{
    for (int i = 0; i < foundwords.length; i++)
    {
        if (word.equals(foundwords[i]))
        {
            return i;
        }
    }
    return -1;
}

第三项任务是拆分并计算找到位置的单词。 更简单的方法(只有我的意见)只是从字符串中删除找到的单词 - 所以写一个函数,以便&#34;保存&#34;数组中找到的单词或计算&#34;计数器&#34; -Array如果已经找到它。

这个最重要的任务是很重要 - 好的,我们只需查找我们正在搜索的字符串的位置。我们需要检查是否找不到(所以最后一个字) 我们将找到的单词(即找到的字符串之前的部分)存储在变量中并执行&#34;计数或创建新单词&#34;事情。然后我们将返回单词的字符串剪切和Seach-String。

截止是很重要的,因为我们将原始字符串替换为没有第一个字的字符串,只需重复此字符串,直到原始字符串为&#34;&#34;。 最后,我们确保函数将返回&#34;&#34;通过将dividerPosition更改为RestString的长度 - 现在只是最后一个单词 - 减去&#34; searchString.length()&#34;所以它适合返回&#34; restString.substring(dividerPosition + searchString.length());&#34;返回&#34;&#34;

在下一部分中查看名为&#34; getNextW(&#34;

)的函数

您可以通过更改

中的注释行来使用自编的IndexOf函数或Java函数运行int
        /// Index Of Search (better)
        //int dividerPosition = restString.indexOf(searchString);

        /// Manual Search (why make it more difficuilt - you should learn to make your work as easy as possible)
        int dividerPosition = indexOf(restString, searchString);

一切

要获得startet,您将在主程序中使用&#34; cut&#34;函数直到String为空 - 现在全部在一起:

public class repeat
{
    public static void main(String[] args)
    {
        String s = "Hello a world a this is a very good test to a a a a world just that contains just more words than just hello";
        String w = " ";

        while (!(s = getNextW(s, w)).equals(""))
        {
            System.out.println(s);
        }
        System.out.println("");
        for (int i = 0; i < foundwords.length; i++)
        {
            // Debuging test:
            System.out.println(String.format("Found word '%s' %d times.", foundwords[i], wordcount[i]));
        }
    }
    private static String[] foundwords = new String[0];
    private static int[] wordcount = new int[0];

    private static String getNextW(String restString, String searchString)
    {

        /// Index Of Search (better)
        //int dividerPosition = restString.indexOf(searchString);

        /// Manual Search (why make it more difficuilt - you should learn to make your work as easy as possible)
        int dividerPosition = indexOf(restString, searchString);

        String foundWord;
        if (dividerPosition > 0)
        {
            foundWord = restString.substring(0, dividerPosition);
        }
        else
        {
            foundWord = restString;
            dividerPosition = restString.length()-searchString.length();
        }
        int IndexOfWord = getIndexOfWord(foundWord, foundwords);
        if (IndexOfWord < 0)
        {
            String[] foundwordsTemp = new String[foundwords.length + 1];
            int[] wordcountTemp = new int[foundwords.length + 1];
            System.arraycopy(foundwords, 0, foundwordsTemp, 0, foundwords.length);
            System.arraycopy(wordcount, 0, wordcountTemp, 0, foundwords.length);
            foundwords = new String[foundwords.length + 1];
            wordcount = new int[wordcount.length + 1];
            System.arraycopy(foundwordsTemp, 0, foundwords, 0, foundwordsTemp.length);
            System.arraycopy(wordcountTemp, 0, wordcount, 0, foundwordsTemp.length);
            foundwords[foundwords.length-1] = foundWord;
            wordcount[foundwords.length-1] = 1;
        }
        else
        {
            wordcount[IndexOfWord]++;
        }
        // Debuging test:
        System.out.println(String.format("Rest of String is '%s' positionnext is %d.", restString, dividerPosition));
        return restString.substring(dividerPosition+searchString.length());
    }
    private static int getIndexOfWord(String word, String[] foundwords)
    {
        for (int i = 0; i < foundwords.length; i++)
        {
            if (word.equals(foundwords[i]))
            {
                return i;
            }
        }
        return -1;
    }
    private static int indexOf(String restString, String searchString)
    {
        int dividerPosition = -1;
        for (int i = 0; i < restString.length()-searchString.length(); i++)
        {
            // Debuging test:
            System.out.println(String.format("search Pos %d in '%s' for length %d.", i, restString, searchString.length()));
            if (restString.substring(i, i + searchString.length()).equals(searchString))
            {
                dividerPosition = i;
                i = restString.length();
            }
        }
        return dividerPosition;
    }
}

使用charAt的其他变体,我正在使用你的那种&#34;计数单词来调整数组大小&#34;什么会导致一个大数组(可能远大):

public class repeat
{
    private static String[] foundwords;
    private static int[] wordcount;
    private static int counter;
    public static void main(String[] args) {
        String s = "Hello a world a this is a very good test to a a a a world just that contains just more words than just hello";
        String w = " ";
        int tempPos = 0;
        counter = 1; // counting total w-strings+1 for dim
        while ((tempPos = findnext(s, w, tempPos)) >= 0)
        {
            tempPos = tempPos + w.length();
            counter++;
        }
        foundwords = new String[counter];
        wordcount = new int[counter];
        counter = 0;
        while ((tempPos = findnext(s, w, 0)) >= 0)
        {
            String foundWord = s.substring(0, tempPos);
            s = s.substring(tempPos + w.length());
            foundWordToArray(foundWord);
        }
        foundWordToArray(s);
        for (int i = 0; i < counter; i++)
        {
            System.out.println(String.format("Found word '%s' %d times.", foundwords[i], wordcount[i]));
        }
    }
    public static int findnext(String haystack, String needle, int startPos)
    {
        int hpos, npos;
        for (hpos = startPos; hpos < haystack.length()-needle.length(); hpos++)
        {
            for (npos = 0; npos < needle.length(); npos++)
            {
                if (haystack.charAt(hpos+npos)!=needle.charAt(npos))
                {
                    npos = needle.length()+1;
                }
            }
            if (npos == needle.length())
            {
                return hpos;
            }
        }
        return -1;
    }
    private static int getIndexOfWord(String word, String[] foundwords)
    {
        for (int i = 0; i < foundwords.length; i++)
        {
            if (word.equals(foundwords[i]))
            {
                return i;
            }
        }
        return -1;
    }
    private static void foundWordToArray(String foundWord)
    {
        int IndexOfWord = getIndexOfWord(foundWord, foundwords);
        if (IndexOfWord < 0)
        {
            foundwords[counter] = foundWord;
            wordcount[counter] = 1;
            counter++;
        }
        else
        {
            wordcount[IndexOfWord]++;
        }
    }
}

我喜欢这个:

public class repeat
{
    private static String[] foundwords = new String[0];
    private static int[] wordcount = new int[0];
    public static void main(String[] args) {
        String s = "Hello a world a this is a very good test to a a a a world just that contains just more words than just hello";
        String w = " ";
        int tempPos;
        while ((tempPos = findnext(s, w, 0)) >= 0)
        {
            String foundWord = s.substring(0, tempPos);
            s = s.substring(tempPos + w.length());
            foundWordToArray(foundWord);
        }
        foundWordToArray(s);
        for (int i = 0; i < foundwords.length; i++)
        {
            System.out.println(String.format("Found word '%s' %d times.", foundwords[i], wordcount[i]));
        }
    }
    private static void foundWordToArray(String foundWord)
    {
        int IndexOfWord = getIndexOfWord(foundWord, foundwords);
        if (IndexOfWord < 0)
        {
            String[] foundwordsTemp = new String[foundwords.length + 1];
            int[] wordcountTemp = new int[foundwords.length + 1];
            System.arraycopy(foundwords, 0, foundwordsTemp, 0, foundwords.length);
            System.arraycopy(wordcount, 0, wordcountTemp, 0, foundwords.length);
            foundwords = new String[foundwords.length + 1];
            wordcount = new int[wordcount.length + 1];
            System.arraycopy(foundwordsTemp, 0, foundwords, 0, foundwordsTemp.length);
            System.arraycopy(wordcountTemp, 0, wordcount, 0, foundwordsTemp.length);
            foundwords[foundwords.length-1] = foundWord;
            wordcount[foundwords.length-1] = 1;
        }
        else
        {
            wordcount[IndexOfWord]++;
        }
    }
    public static int findnext(String haystack, String needle, int startPos)
    {
        int hpos, npos;
        for (hpos = startPos; hpos < haystack.length()-needle.length(); hpos++)
        {
            for (npos = 0; npos < needle.length(); npos++)
            {
                if (haystack.charAt(hpos+npos)!=needle.charAt(npos))
                {
                    npos = needle.length()+1;
                }
            }
            if (npos == needle.length())
            {
                return hpos;
            }
        }
        return -1;
    }
    private static int getIndexOfWord(String word, String[] foundwords)
    {
        for (int i = 0; i < foundwords.length; i++)
        {
            if (word.equals(foundwords[i]))
            {
                return i;
            }
        }
        return -1;
    }
}