2012-06-03 10 views
8

Mam zadanie domowe, aby policzyć konkretne znaki w ciągu.liczyć określone znaki w ciągu znaków (Java)

Na przykład: string = "America"

Wyjście powinno być = 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); 
    } 
    } 
} 

kod powyżej jest to, co mam zrobić, ale myślę, że nie ma sensu mieć 26 zmiennych (po jednym dla każdej litery). Czy macie alternatywny rezultat?

+1

pomocą tablicę z 26 indeksów. ('' a '-' a '== 0,' b '-' a '== 1', tak i tak dalej). – Jeffrey

Odpowiedz

7

Oczywiście twoja intuicja posiadania zmiennej dla każdej litery jest poprawna.

Problem polega na tym, że nie masz zautomatyzowanego sposobu wykonywania tej samej pracy na różnych zmiennych, nie masz żadnej trywialnej składni, która pomaga ci wykonać tę samą pracę (licząc jedną częstotliwość char) dla 26 różnych zmienne.

Co więc można zrobić? Będę schować się w kierunku dwóch rozwiązań:

  • można użyć tablicę (ale trzeba będzie znaleźć sposób na mapę znaków a-z do indeksów 0-25, które jest w jakiś sposób trywialny jest Twój powód o kodowaniu ASCII)
  • można użyć HashMap<Character, Integer> który jest asocjacyjną kontenera, że ​​w tej sytuacji, pozwala mieć numery odwzorowanych na konkretne znaki, dlatego idealnie pasuje do Twoich potrzeb
+0

Z Guava można również użyć ['Multiset '] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multiset.html), ale to chyba przesada dla zadanie domowe :) –

4

można użyć HashMap klucza charakter i wartość całkowitą.

HashMap<Character,Integer> 

iterację ciąg

-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 

Jest to pseudo kod i trzeba spróbować kodowania to

+0

To rozwiąże każdą postać. Lubię to. –

0

W kontynuacji na odpowiedź Jacka następujący kod może być rozwiązanie. Używa tablicy do przechowywania częstotliwości znaków.

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

To daje następujący wynik:

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

O kodzie c [i] -97, czy to działałoby zgodnie z oczekiwaniami? Jest to dla mnie podejrzane, ponieważ zmienna c jest typem char i odejmuje liczbę całkowitą. W języku C możesz sprawić, by działało, ale Java jest dużo bardziej restrykcyjnym językiem do pisania. Dlatego nie zachęcam go. Używanie kodowania ASCII jest bezpieczniejsze i bardziej konwencjonalne. Na przykład, jaka jest wartość ASCII litery "a"? –

+0

@The OrigninalAndroid: tak, to by było. nie opublikowałbym go, gdyby nie. 'Gdy operacja arytmetyczna jest wykonywana między znakiem a liczbą całkowitą, jest faktycznie wykonywana między wartością ascii znaku a liczbą całkowitą. Wynikiem takiej operacji jest również liczba całkowita. Wartość ascii "a" wynosi 97 !! – WickeD

2

używam HashMap do rozwiązania.

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

} 

wytwarzanym - {U = 2, A = 3, B = 2, n = 3}

+0

czy próbowałeś? ponieważ daje +1 dla każdej litery – David

+0

zapomniałeś o innym, i działa dobrze dzięki! – 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

witamy w stackoverflow, to pomaga, jeśli podasz jakieś wyjaśnienie, aby pasował do twojego kodu. w ten sposób, zamiast kopiować/wklejać i mieć nadzieję, że zadziała, osoba zadająca pytanie będzie mogła zobaczyć, dlaczego coś działa, i dlaczego nie ma – smerny

0

może można użyć tego

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

na przykład:

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

Należy policzyć znak "l" w ciągu znaków.

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

lub

int count= StringUtils.countMatches("Hello", "l"); 
Powiązane problemy