2010-12-06 19 views
8

El siguiente código es para contar la ocurrencia de cada carácter y debe imprimir el conteo. Pero con el código que he intentado obtengo solo un 1, no sé los cambios que debo hacer. Por favor, ayúdame.Implementación Hashmap para contar las ocurrencias de cada carácter

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.HashMap; 
import java.util.Map; 

class Count_CharMap { 
public static void main(String[] args) { 
    try 
    { 
     FileInputStream file = new FileInputStream("D:\\trial.txt"); 
     DataInputStream dis = new DataInputStream(file); 
     BufferedReader br = new BufferedReader(new InputStreamReader(dis)); 
     String Contents=""; 
     String str=""; 

     while ((Contents = br.readLine()) != null) { 
      str+=Contents; 
     } 

     char[]char_array =str.toCharArray(); 
     int count = 0; 
     char ch = char_array[count]; 
     Map<Character,Integer> charCounter=new HashMap<Character,Integer>(); 
     for(int i=0;i<str.length();i++) 
     { 
      if(charCounter.containsKey(char_array[i])) 
      { 
       charCounter.put(ch, charCounter.get(ch)+1); 
      } 
      else 
      { 
       charCounter.put(ch, 1); 
      } 
     } 

     for(Character key:charCounter.keySet()) 
     { 
      System.out.println(key+""+charCounter.get(key)); 
     } 
    } 
    catch(IOException e1){ 
     System.out.println(e1); 
    } 
    } 
} 

salida real debe ser como Si tengo en mi abcdabc trial.txt se debe imprimir una 2b 2c 2 d 1.

+2

mella su código correctamente, se le ayudará a conseguir ayuda. –

Respuesta

8

Te vas juego de caracteres ch como el mismo carácter a través de cada ejecución del bucle

Debería ser:

ch = char_array[i]; 
if(charCounter.containsKey(ch)){ 
    charCounter.put(ch, charCounter.get(ch)+1); 
} 
else 
{ 
    charCounter.put(ch, 1); 
} 

dentro del bucle.

+0

hay muchas gracias. Tonto soy :-) El código imprime perfectamente todos los personajes y ocurrencias. Quiero imprimirlos en orden alfabético. ¿Como hacer eso? – Sumithra

+1

Use un mapa de árbol en lugar de un hashmap y debería hacerlo. Si no, tendrás que ordenarlo usando un comparador, googleándolo. http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeMap.html – Paul

+1

Great Paul. +1 de mi parte – Mudassir

1
import java.util.HashMap; 
import java.util.Map; 
... 
Map<String, Integer> freq = new HashMap<String, Integer>(); 
... 
int count = freq.containsKey(word) ? freq.get(word) : 0; 
freq.put(word, count + 1); 
2

Hai Todo El código siguiente es para contar la ocurrencia de cada carácter y debe imprimir el recuento. puede ser de ayuda .. Gracias por ver

paquete com.corejava;

import java.util.Map; 
import java.util.TreeMap; 

public class Test { 
    public static void main(String[] args) { 

     String str = "ramakoteswararao"; 

     char[] char_array = str.toCharArray(); 

     System.out.println("The Given String is : " + str); 

    Map<Character, Integer> charCounter = new TreeMap<Character, Integer>(); 

     for (char i : char_array) { 

    charCounter.put(i,charCounter.get(i) == null ? 1 : charCounter.get(i) + 1); 

     } 

    for (Character key : charCounter.keySet()) { 
    System.out.println("occurrence of '" + key + "' is "+ charCounter.get(key)); 
     } 

    } 

} 
+0

Hola, bienvenido a SO. Cuando publica una solución en código, puede ser útil incluir un breve resumen de la línea de pensamiento. –

3

Java 8 corrientes:

Map<String, Long> map = 
    Arrays.stream(string.split("")). 
    collect(Collectors.groupingBy(c -> c, Collectors.counting())); 

guayaba HashMultiset:

Multiset<Character> set = HashMultiset.create(Chars.asList("bbc".toCharArray())); 
assertEquals(2, set.count('b')); 
0

dentro del bucle

ch = char_array[i];
charCounter.put(charCounter.contains(ch)?charCounter.get(ch)+1:1);

0
import java.util.TreeMap; 

public class OccuranceDemo { 
    public static void main(String[] args) { 
     TreeMap<String , Integer> mp=new TreeMap(); 
     String s="rain rain go away"; 
     String[] arr = s.split(" "); 
     int length=arr.length; 
     for(int i=0;i<length;i++) 
     { 
     String h = arr[i]; 
     mp.put(h, mp.get(h)==null?1:mp.get(h)+1); 
    } 
    System.out.println(mp.get("go")); 
    } 
} 
+0

Si es necesario, obtenemos otra clave en el ejemplo anterior que hemos tomado, vaya –

+0

Hola, bienvenidos a SO. Un buen primer intento, pero su respuesta en realidad no cumple con una serie de requisitos: (1) Cuenta las palabras, no los caracteres (2) No imprime las palabras y los recuentos al final - doesn ' t trabajo para cadenas arbitrarias (3) No hace Hashmap, como se le preguntó (4) No arregla el código del asker, pero ofrece otra solución. Lea atentamente la pregunta en el futuro antes de preguntar. Consulte esta guía: https://stackoverflow.com/help/how-to-withwer – theFunkyEngineer

0
String str=new String("aabbbcddddee"); 
    char[] ch=str.toCharArray(); 
    HashMap<Character,Integer> hm=new HashMap<Character,Integer>(); 
    for(char ch1:ch) 
    { 

     if(hm.containsKey(ch1)) 
     { 
      hm.put(ch1,hm.get(ch1)+1); 
     } 
     else 
     { 
      hm.put(ch1,1); 
     } 
    } 

    Set s1=hm.entrySet(); 
    Iterator itr=s1.iterator(); 

    while(itr.hasNext()) 
    { 
     Map.Entry m1=(Map.Entry)itr.next(); 
     System.out.println(m1); 
    } 
0
import java.util.*; 

public class Test { 
    public static void main(String[] args) { 

     String str = "STACKOVERFLOW"; 

     char[] char_array = str.toCharArray(); 

     System.out.println("The Given String is : " + str); 

    Map<Character, Integer> charCounter = new TreeMap<Character, Integer>(); 

     for (char i : char_array) { 

    charCounter.put(i,charCounter.get(i) == null ? 1 : charCounter.get(i) + 1); 

     } 

    for (Character key : charCounter.keySet()) { 
    System.out.println("occurrence of '" + key + "' is "+ charCounter.get(key)); 
     } 

    } 

} 
Cuestiones relacionadas