Java无限循环问题

时间:2015-03-20 09:11:48

标签: java

所以我们的老师给了我们这个功课,我们不得不写一个类似于

的程序
  

编写一个从键盘读取一行文本的应用程序,并打印一个表格,指出每个字母的出现次数   文本中的字母表,例如,短语

     

成为或不成为:这是一个问题:

     

包含一个“a”,两个“b”,“no”,“等等”。

我已经编写了代码,但是当我输入要成为或不成为代码时,我遇到了一个小问题。我永远看了这个程序,我甚至试过问雅虎的一些人(但我觉得我很困惑)。所以我希望有人在这里找到我错过的东西,或者给我一些建议。

public class occurances {
    public static void main(String[] args) {
        Scanner inp = new Scanner(System.in);
        String str;
        char ch;
        int count = 0;

        System.out.println("Enter the string:");
        str = inp.nextLine();

        while (str.length() > 0) {
            ch = str.charAt(0);
            int i = 0;

            while (i < str.length() && str.charAt(i) == ch) {
                count = count++;
                i++;
            }

            str = str.substring(count);
            System.out.println(ch);
            System.out.println(count);
        }
    }
}

5 个答案:

答案 0 :(得分:3)

您的代码存在许多问题,但请从count = count++开始。它将始终具有其初始值(在您的情况下为0)。这导致无限循环。如果您管理这个,那么您可以进一步调试代码。了解如何使用调试器和/或打印来检查代码。祝你好运。

答案 1 :(得分:2)

看来你的方法不一定是老师想要的方法。您的方法(如果它完全有效)将按字符在字符串中出现的顺序显示字符计数。因此,例如,对于“要成为或不成为:这是问题”,您将首先显示“T”的字符数,而教师可能希望您首先显示“a”的字符数。您的方法也不会显示答案中缺少的字符的字符数。

在其他两个答案中建议使用Map。我推荐这种方法,尽管你可以使用一个简单的int[]数组,其索引是(ch - 'a'),假设它在025之间。请参阅Character.toLowerCase()了解如何将字符转换为小写字符,因为正确的答案可能会将“T”和“t”视为相同。

数组中只需要一个循环,递增显示的字符的计数。显然,所有计数应该在循环之前初始化为0

答案 2 :(得分:0)

您的代码中需要解决的一些问题:

  • while(str.length()>0):这里有无限循环。您可以使用for (int index = 0; index < str.length(); index++)
  • 查看字符串
  • ch = str.charAt(0);:在这里你总是拿着字符串的第一个字母,你应该用ch = str.charAt(index);取每个字母。
  • count = count++;count++;就足够了count = count + 1;
  • count = count++;:应该在内部循环之前为每个字母count = 0;重新初始化计数。
  • str = str.substring(count);:这里不需要子串。你会松开字母进行下一次计算。

您的代码应该适用于一种不满。这些字母和它们的数量将被记录为它们的出现次数。如果a在字符串中是3次,则a : 3将被写入3次。

所以你应该是否已经打印过这封信(也许是一个数组),但性能会很差。对于n个字母的字符串,您将有n * n个计算(Complexity O(n ^ 2))。如果你在字母和它们的计数之间取一个HashMap,你只需要遍历字符串一次,在迭代循环时递增你的计数器。那你就只有n次计算。 (复杂性O(n))。

HashMap<Char, Integer> letters = new HashMap<Char, Integer>();
for (int i = 0; i < str.length(); i++) {
   char letter = str.charAt(i);
   if (!letters.contains(letter)) {
     letters.put(letter, 1);
   } else {
     letters.put(letter, letters.get(letter) + 1);
   }
}

然后,您将浏览地图以显示计数。

答案 3 :(得分:0)

我有一段时间没有做JAVA我来这里帮助Javascript的人...但我会放弃它

while(str.length()>0)

这显然会进入一个无限循环,因为你没有突破性的条款...我可能会使用for循环...你也需要一些东西来存储你找到的每个独特字母的计数。

- 根据下面的评论进行编辑,我发现自己同意回答你的作业不是一件好事,但这是我建议你看的......

  1. 查看Hashtables或地图以及关于“在找到字典时存储字典计数”的事情
  2. 请记住大写和小写字母,我只是强制转换为小写并计算
  3. 使用for循环而不是while循环,使用字符串长度作为限制,例如从0到string.length()
  4. 计数

    这可以让你走上正确的道路:http://www.java2s.com/Tutorial/Java/0140__Collections/GettingelementskeyvaluepairsfromaHashtabletheentrySetmethod.htm

答案 4 :(得分:0)

以下是您提出的问题的更正代码。试试这个..

import java.util.*;

public class Occurence {
    public static void main(String[] args) {
        Scanner inp = new Scanner(System.in);
        String str;
        char ch;
        int count = 0;

        System.out.println("Enter the string:");
        str = inp.nextLine();
        int length = str.length();
        int i = 0, j = 0;

        for (i = 0; i < length; i++) {
            j = 0;
            count=0;

            for (j = 0; j < length; j++) {
                if (str.charAt(j) == str.charAt(i)) {
                    count++; 
                }

                System.out.println(str.charAt(i)+" "+count); 
            }
        }
    }
}