2012-06-03 13 views
8

Ho un compito a casa per contare i caratteri specifici nella stringa.conteggio di caratteri specifici in una stringa (Java)

Ad esempio: string = "America"

l'uscita dovrebbe essere = 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 codice

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); 
    } 
    } 
} 

di cui sopra è quello che ho fatto, ma penso che non è senso avere 26 variabili (uno per ogni lettera). Avete un risultato alternativo?

+1

utilizzare una matrice con 26 indici. (''a' - 'a' == 0, 'b' - 'a' == 1', così via e così via). – Jeffrey

risposta

7

Ovviamente l'intuizione di avere una variabile per ogni lettera è corretta.

Il problema è che non si ha alcun modo automatico di fare lo stesso lavoro su variabili diverse, non si ha alcuna sintassi banale che ti aiuti a fare lo stesso lavoro (contando una singola frequenza di char) per 26 differenti variabili.

Quindi cosa potresti fare? Ti Suggerimento È verso due soluzioni:

  • è possibile utilizzare un array (ma si dovrà trovare un modo per mappare carattere a-z a indici 0-25, che è in qualche modo banale è che si ragioni sulla codifica ASCII)
  • è possibile utilizzare una HashMap<Character, Integer> che è un contenitore associativo che, in questa situazione, ti permette di avere i numeri mappati ai caratteri specifici in modo che si adatta perfettamente alle vostre esigenze
+0

Con Guava si potrebbe anche usare un ['Multiset '] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multiset.html) ma probabilmente questo è eccessivo compiti :) –

4

è possibile utilizzare HashMap di chiave di carattere e valore intero.

HashMap<Character,Integer> 

iterate attraverso la stringa

-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 

Questa è una pseudo codice e si deve provare la codifica è

+0

Questo risolverà qualsiasi personaggio. Mi piace. –

0

In continuità alla risposta di Jack il seguente codice potrebbe essere la vostra soluzione. Usa la matrice per memorizzare la frequenza dei caratteri.

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]); 
     }  
    } 
} 

che darà il seguente risultato:

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

Informazioni sul codice c [i] -97, funzionerebbe come previsto? È un sospetto per me dal momento che la variabile c è di tipo char e sta sottraendo un numero intero. In linguaggio C, puoi farlo funzionare, ma Java è un linguaggio di scrittura molto più rigido. Quindi non lo incoraggio. L'uso della codifica ASCII è più sicuro e più convenzionale. Ad esempio, qual è il valore ASCII della lettera "a"? –

+0

@ TheOriginalAndroid: sì, lo farebbe. non l'avrei postato se non fosse così. 'Quando un'operazione aritmetica viene eseguita tra un personaggio e un intero, viene effettivamente eseguita tra il valore ascii del carattere e il numero intero. Il risultato di tale operazione è anche un numero intero. Il valore di ascii di 'a' è 97 !! – WickeD

2

Sto usando un HashMap per la soluzione.

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()); 
} 

} 

output prodotto - {U = 2, A = 3, B = 2, N = 3}

+0

hai provato? perché dà +1 per ogni lettera – David

+0

hai dimenticato il resto, e funziona bene grazie! – 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

benvenuto in stackoverflow, è utile se fornisci qualche spiegazione per andare avanti con il tuo codice. in questo modo, piuttosto che copiare/incollare e sperare che funzioni, la persona che fa la domanda sarà in grado di capire perché qualcosa funziona, e perché non c'è – smerny

0

forse si può usare questo

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; 
} 

ad esempio:

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

Conta char 'l' nella stringa.

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"); 
Problemi correlati