如何在字符串中计算字符出现的次数?

621
我有一个字符串
a.b.c.d
我希望以惯用方式计算“.”的出现次数,最好是一行代码解决。
(之前我曾表达过这个限制条件为“不使用循环”,以防你想知道为什么每个人都试图回答而不使用循环)。

1
作业?否则我看不出避免循环的要求。 - PhiLho
26
不是不喜欢使用循环,只是在寻找一个惯用语的一行代码。 - Bart
2
循环语句就是为了解决这样的问题而设计的,在通用工具类中编写循环,然后调用你刚创建的一行代码。 - che javara
字符串相关的类似问题:https://dev59.com/_HRA5IYBdhLWcg3w9ivq - koppor
显示剩余2条评论
48个回答

0

使用Java 8和HashMap,不需要任何库来计算所有不同字符:

private static void countChars(String string) {
    HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    string.chars().forEach(letter -> hm.put(letter, (hm.containsKey(letter) ? hm.get(letter) : 0) + 1));
    hm.forEach((c, i) -> System.out.println(((char)c.intValue()) + ":" + i));
}

0

尝试这段代码:

package com.java.test;

import java.util.HashMap;
import java.util.Map;

public class TestCuntstring {

    public static void main(String[] args) {

        String name = "Bissssmmayaa";
        char[] ar = new char[name.length()];
        for (int i = 0; i < name.length(); i++) {
            ar[i] = name.charAt(i);
        }
        Map<Character, String> map=new HashMap<Character, String>();
        for (int i = 0; i < ar.length; i++) {
            int count=0;
            for (int j = 0; j < ar.length; j++) {
                if(ar[i]==ar[j]){
                    count++;
                }
            }
            map.put(ar[i], count+" no of times");
        }
        System.out.println(map);
    }

}

0

这是最简单易懂的方法,不使用数组,只使用哈希表。它还可以计算空格、大写字母和小写字母、特殊字符等。

import java.util.HashMap;
  //The code by muralidharan  
    public class FindChars {
        
        public static void main(String[] args) {
            
            findchars("rererereerererererererere");
        }
        
        public static void findchars(String s){
            
            HashMap<Character,Integer> k=new HashMap<Character,Integer>();
            for(int i=0;i<s.length();i++){
                if(k.containsKey(s.charAt(i))){
                Integer v =k.get(s.charAt(i));
                k.put(s.charAt(i), v+1);
                }else{
                    k.put(s.charAt(i), 1);
                }
                
            }
            System.out.println(k);
            
        }
    
    }

输出:{r=12,e=13}

第二个输入:

findchars("The world is beautiful and $#$%%%%%%@@@@ is worst");

输出: { =7, @=4, a=2, b=1, #=1, d=2, $=2, e=2, %=6, f=1, h=1, i=3, l=2, n=1, o=2, r=2, s=3, T=1, t=2, u=2, w=2}


0
使用一个lambda函数来删除所有字符以进行计数,计数是之前长度和之后长度的差。
String s = "a.b.c.d";
int count = s.length() - deleteChars.apply( s, "." ).length();  // 3

在这里查找deleteChars


如果您需要计算多个字符的出现次数,可以一次完成:
例如,对于bc.

int count = s.length() - deleteChars.apply( s, "bc." ).length();  // 5

0
如果你想要计算字符串 'SELENIUM' 中相同字符的数量,或者想要打印出该字符串中独特的字符。
public class Count_Characters_In_String{

     public static void main(String []args){

        String s = "SELENIUM";
        System.out.println(s);
        int counter;

       String g = "";

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

        if(g.indexOf(s.charAt(i)) == - 1){
           g=g+s.charAt(i); 
          }

       }
       System.out.println(g + " ");



        for( int i=0; i<g.length(); i++ ) {          
          System.out.print(",");

          System.out.print(s.charAt(i)+ " : ");
          counter=0; 
          for( int j=0; j<s.length(); j++ ) { 

        if( g.charAt(i) == s.charAt(j) ) {
           counter=counter+1;

           }      

          }
          System.out.print(counter); 
       }
     }
}

/******************** 输出 **********************/

SELENIUM

SELNIUM

S: 1,E: 2,L: 1,E: 1,N: 1,I: 1,U: 1


-1
public static void getCharacter(String str){

        int count[]= new int[256];

        for(int i=0;i<str.length(); i++){


            count[str.charAt(i)]++;

        }
        System.out.println("The ascii values are:"+ Arrays.toString(count));

        //Now display wht character is repeated how many times

        for (int i = 0; i < count.length; i++) {
            if (count[i] > 0)
               System.out.println("Number of " + (char) i + ": " + count[i]);
        }


    }
}

一大块代码并不是一个好的答案。也许可以尝试通过陈述原因、解释、注意事项等来扩展答案。 - user1531971
Java不使用ASCII;char是UTF-16代码单元。范围为0..Character.MAX_VALUE。如果目标是计算UTF-16代码单元的出现次数,则您的算法有效。 - Tom Blodget

-3
public class OccurencesInString { public static void main(String[] args) { String str = "NARENDRA AMILINENI"; HashMap occur = new HashMap(); int count =0; String key = null; for(int i=0;i<str.length()-1;i++){ key = String.valueOf(str.charAt(i)); if(occur.containsKey(key)){ count = (Integer)occur.get(key); occur.put(key,++count); }else{ occur.put(key,1); } } System.out.println(occur); } }

2
我看到这个答案被截断了,所以也许你不需要以下的建议。但为了确保:1)不要只是粘贴一些代码。解释一下,告诉我们为什么你认为这是一个好的解决方案。2)格式化你的代码:http://stackoverflow.com/editing-help - cornuz
仅提供代码的答案会被自动标记为低质量,因此在stackoverflow上不建议使用。将来,请详细说明您的答案,并解释为什么它是问题的解决方案。这有助于其他用户。另外,你从未听说过回车符吗? - tom redfern

-5

我尝试使用switch语句解决您的问题,但仍需要for循环来解析字符串。如果您有任何改进代码的意见,请随时评论。

public class CharacterCount {
public static void main(String args[])
{
    String message="hello how are you";
    char[] array=message.toCharArray();
    int a=0;
    int b=0;
    int c=0;
    int d=0;
    int e=0;
    int f=0;
    int g=0;
    int h=0;
    int i=0;
    int space=0;
    int j=0;
    int k=0;
    int l=0;
    int m=0;
    int n=0;
    int o=0;
    int p=0;
    int q=0;
    int r=0;
    int s=0;
    int t=0;
    int u=0;
    int v=0;
    int w=0;
    int x=0;
    int y=0;
    int z=0;


    for(char element:array)
    {
        switch(element)
        {
        case 'a':
        a++;
        break;
        case 'b':
        b++;
        break;
        case 'c':c++;
        break;

        case 'd':d++;
        break;
        case 'e':e++;
        break;
        case 'f':f++;
        break;

        case 'g':g++;
        break;
        case 'h':
        h++;
        break;
        case 'i':i++;
        break;
        case 'j':j++;
        break;
        case 'k':k++;
        break;
        case 'l':l++;
        break;
        case 'm':m++;
        break;
        case 'n':m++;
        break;
        case 'o':o++;
        break;
        case 'p':p++;
        break;
        case 'q':q++;
        break;
        case 'r':r++;
        break;
        case 's':s++;
        break;
        case 't':t++;
        break;
        case 'u':u++;
        break;
        case 'v':v++;
        break;
        case 'w':w++;
        break;
        case 'x':x++;
        break;
        case 'y':y++;
        break;
        case 'z':z++;
        break;
        case ' ':space++;
        break;
        default :break;
        }
    }
    System.out.println("A "+a+" B "+ b +" C "+c+" D "+d+" E "+e+" F "+f+" G "+g+" H "+h);
    System.out.println("I "+i+" J "+j+" K "+k+" L "+l+" M "+m+" N "+n+" O "+o+" P "+p);
    System.out.println("Q "+q+" R "+r+" S "+s+" T "+t+" U "+u+" V "+v+" W "+w+" X "+x+" Y "+y+" Z "+z);
    System.out.println("SPACE "+space);
}

}


这与单行代码相去甚远。糟糕透了。 - james.garriss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接