如何使这个String计数器代码更有效?

时间:2016-02-08 09:28:47

标签: java performance

这是我的代码。 方法counter计算字符串中每个字母出现的次数。

public class Hard {

public static void counter (String s) {

  for (int n = 0; n < s.length() ; n++) {

       int count = 0 ,bool = 1;

       if (n > 0) {  

          for (int L = n-1 ; L >= 0  ; L--) {
             if (s.charAt(n) == s.charAt(L)) {bool = 0; }         
          }

       }

       for (int f = 0; f < s.length() ; f++ ) {
         if (bool == 0) { break ; }

         if (s.charAt(n) == s.charAt(f)) {count++;}
       }

       if (count > 0 ) {

         System.out.println(s.charAt(n)+" appears "+count+" times.");
       }
  }    

}

 public static void main (String[] args) {
   counter("bbaddadxzxwfgb$.fgfdf");                  
 }

}

3 个答案:

答案 0 :(得分:2)

假设您正在使用Java并假设A和a被视为相同的字母。

public static int[] counter (String s) {
    int [] countArr = new int[26];
    for(int i=0; i<s.length(); i++) {
        char charAtI = s.charAt(i);
        if(Character.isLetter(charAtI)) {
            countArr[Character.isUpperCase(charAtI) ? charAtI - 'A' : charAtI - 'a']++;
        }
    }
    return countArr;
}

public static void main (String[] args) {
    int [] countArr = counter("asif and abid.");
    for(int i = 0; i<countArr.length; i++) {
        if(countArr[i] > 0) {
            System.out.println(MessageFormat.format("{0} appears {1} times", (char)(i + 'a'), countArr[i]));
        }
    }
}

优化的关键在于它执行一个传递而没有嵌套循环,一旦掌握了所需的所有信息,就会担心如何将其呈现给用户。

答案 1 :(得分:2)

 public static HashMap<Character, Integer> counter(String input) {

    HashMap<Character, Integer> chCount = new HashMap<>();
    for (int i = 0 i < input.length(); i++) {
        char c = input.charAt(i);
        if (chCount.containsKey(c)) {
        int count = chCount.get(c);
        chCount.put(c, count + 1);
        } else {
        chCount.put(c, 1);
        }
    }
    return chCount;
    }

您也可以使用哈希映射。它适用于其他字符,如'#'等,你可以区别对待'A'和'a',因为键值会有所不同。
HashMap tutorials Point

答案 2 :(得分:0)

您可以使用 java 8

计算这样的字符数
public static void main(String[] args){

        String string="what is this?";
        List<Character> chars=string.chars().distinct().mapToObj(i->Character.valueOf((char)i)).filter(p->Character.isAlphabetic(p)).collect(Collectors.toList());
        chars.forEach(c->{
        long count=string.chars().mapToObj(i->Character.valueOf((char)i)).filter(p->p==c).count();
        System.out.println(c+" appear "+count+" times");
        });
 }