2012-06-03 31 views
8

Tengo una tarea asignada para contar caracteres específicos en una cadena.cuente caracteres específicos en una cadena (Java)

Por ejemplo: string = "America"

la salida debe ser = a appear 2 times, m appear 1 time, e appear 1 time, r appear 1 time, i appear 1 time and c appear 1 time

public class switchbobo { 

/** 
* @param args 
*/  // TODO Auto-generated method stub 
    public static void main(String[] args){ 
    String s = "BUNANA"; 
    String lower = s.toLowerCase(); 
    char[] c = lower.toCharArray(); // converting to a char array 
    int freq =0, freq2 = 0,freq3 = 0,freq4=0,freq5 = 0; 

    for(int i = 0; i< c.length;i++) { 
     if(c[i]=='a') // looking for 'a' only 
      freq++; 
     if(c[i]=='b') 
      freq2++; 
     if (c[i]=='c') { 
      freq3++; 
     } 

     if (c[i]=='d') { 
      freq4++; 
     }  
    } 
    System.out.println("Total chars "+c.length); 
    if (freq > 0) { 
     System.out.println("Number of 'a' are "+freq); 
    } 
    } 
} 

código anterior es lo que he hecho, pero creo que no se tiene sentido tener 26 variables (una para cada letra) ¿Ustedes tienen un resultado alternativo?

+1

utilizar una matriz con 26 índices. ('' a '-' a '== 0,' b '-' a '== 1', etc.). – Jeffrey

Respuesta

7

Obviamente, su intuición de tener una variable para cada letra es correcta.

El problema es que no tienes ninguna forma automatizada para hacer el mismo trabajo en diferentes variables, no tienes ninguna sintaxis trivial que te ayude a hacer el mismo trabajo (contando una sola frecuencia de caracteres) para 26 diferentes variables.

¿Qué podrías hacer? Te voy a insinuar hacia dos soluciones:

  • se puede utilizar una matriz (pero tendrá que encontrar una manera de mapa de caracteres a-z a índices 0-25, que es de alguna manera trivial es que razonar sobre la codificación ASCII)
  • puede utilizar un HashMap<Character, Integer> que es un contenedor asociativo que, en esta situación, le permite tener los números asignados a los caracteres específicos por lo que se adapta perfectamente a sus necesidades
+0

Con Guava también se podría usar un ['Multiset '] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multiset.html) pero eso es probablemente demasiado para tarea :) –

4

puede utilizar HashMap de la clave del carácter y el valor entero.

HashMap<Character,Integer> 

iterar a través de la cadena

-if the character exists in the map get the Integer value and increment it. 
-if not then insert it to map and set the integer value for 0 

Este es un pseudo código y hay que tratar de codificación que

+0

Esto resolverá cualquier personaje. Me gusta. –

0

Como continuación a la respuesta de Jack el siguiente código podría ser su solución. Utiliza una matriz para almacenar la frecuencia de los caracteres.

public class SwitchBobo 
{ 
    public static void main(String[] args) 
    { 
     String s = "BUNANA"; 
     String lower = s.toLowerCase(); 
     char[] c = lower.toCharArray(); 
     int[] freq = new int[26]; 
     for(int i = 0; i< c.length;i++) 
     { 
     if(c[i] <= 122) 
     { 
      if(c[i] >= 97) 
      { 
       freq[(c[i]-97)]++; 
      } 
     }   
     } 
     System.out.println("Total chars " + c.length); 
     for(int i = 0; i < 26; i++) 
     { 
     if(freq[i] != 0) 
      System.out.println(((char)(i+97)) + "\t" + freq[i]); 
     }  
    } 
} 

Se dará el siguiente resultado:

Total chars 6 
a  2 
b  1 
n  2 
u  1 
+0

Acerca del código c [i] -97, ¿funcionaría como se esperaba? Es sospechoso para mí, ya que la variable c es el tipo de caracteres y resta un entero. En lenguaje C, puede hacer que funcione, pero Java es un lenguaje de tipado mucho más estricto. Por lo tanto, no lo animo. El uso de codificación ASCII es más seguro y más convencional. Por ejemplo, ¿cuál es el valor ASCII de la letra 'a'? –

+0

@TheOriginalAndroid: sí, lo haría. No lo habría publicado si no lo hubiera hecho. 'Cuando se realiza una operación aritmética entre un carácter y un número entero, en realidad se realiza entre el valor ascii del carácter y el número entero. El resultado de tal operación también es un número entero. ¡El valor ascii de 'a' es 97! – WickeD

2

estoy usando un HashMap para la solución.

import java.util.*; 

public class Sample2 { 

/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    HashMap<Character, Integer> map = new HashMap<Character, Integer>(); 
    String test = "BUNANA"; 
    char[] chars = test.toCharArray(); 

    for(int i=0; i<chars.length;i++) 
    { 
     if(!map.containsKey(chars[i])) 
     { 
      map.put(chars[i], 1); 
     } 
     map.put(chars[i], map.get(chars[i])+1); 
    } 

    System.out.println(map.toString()); 
} 

} 

salida producidas - {T = 2, A = 3, B = 2, N = 3}

+0

has probado? porque da +1 por cada letra – David

+0

has olvidado lo demás, y funciona bien gracias! – David

0
int a[]=new int[26];//default with count as 0 
for each chars at string 
if (String having uppercase) 
    a[chars-'A' ]++ 
if lowercase 
then a[chars-'a']++ 
0
public class TestCharCount { 
    public static void main(String args[]) { 
     String s = "america"; 
     int len = s.length(); 
     char[] c = s.toCharArray(); 
     int ct = 0; 
     for (int i = 0; i < len; i++) { 
      ct = 1; 
      for (int j = i + 1; j < len; j++) { 
       if (c[i] == ' ') 
        break; 
       if (c[i] == c[j]) { 
        ct++; 
        c[j] = ' '; 
       } 

      } 
      if (c[i] != ' ') 
       System.out.println("number of occurance(s) of " + c[i] + ":" 
         + ct); 

     } 
    } 
} 
+1

bienvenido a stackoverflow, ayuda si proporciona alguna explicación para seguir su código. De esta manera, en lugar de copiar/pegar y esperar que funcione, la persona que hace la pregunta podrá ver por qué algo funciona y por qué no lo hizo. – smerny

0

tal vez usted puede utilizar este

public static int CountInstanceOfChar(String text, char character ) { 
    char[] listOfChars = text.toCharArray(); 
    int total = 0 ; 
    for(int charIndex = 0 ; charIndex < listOfChars.length ; charIndex++) 
     if(listOfChars[charIndex] == character) 
      total++; 
    return total; 
} 

por ejemplo:

String text = "america"; 
char charToFind = 'a'; 
System.out.println(charToFind +" appear " + CountInstanceOfChar(text,charToFind) +" times"); 
0

Contar char 'l' en la cadena.

String test = "Hello"; 
    int count=0; 
    for(int i=0;i<test.length();i++){ 
    if(test.charAt(i)== 'l'){ 
     count++; 
     } 
    } 

o

int count= StringUtils.countMatches("Hello", "l"); 
Cuestiones relacionadas