2012-09-07 16 views
5

Necesito ingresar dos cadenas, siendo la primera una palabra y la segunda cadena una parte de la cadena anterior y necesito dar salida la cantidad de veces cadena el número dos ocurre. Entonces, por ejemplo: String 1 = CATSATONTHEMAT String 2 = AT. La salida sería 3 porque AT ocurre tres veces en CATSATONTHEMAT. Aquí está mi código:Obteniendo el número de ocurrencias de una cadena en otra cadena

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String word8 = sc.next(); 
    String word9 = sc.next(); 
    int occurences = word8.indexOf(word9); 
    System.out.println(occurences); 
} 

emite 1 cuando utilizo este código.

+1

'indexOf' no devuelve un conteo, devuelve la posición de la primera aparición. [Javadocs] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf%28java.lang.String%29) – Brian

+2

Duplicado exacto de las cadenas de: http : //stackoverflow.com/questions/12309109/comparing-a-substring-to-a-string-in-java – JTMon

+0

@Brian Es por eso que está pidiendo ayuda. De todas formas, ¿regex al rescate? –

Respuesta

3

También puede probar:

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String word8 = sc.nextLine(); 
    String word9 = sc.nextLine(); 
    int index = word8.indexOf(word9); 
    sc.close(); 
    int occurrences = 0; 
    while (index != -1) { 
     occurrences++; 
     word8 = word8.substring(index + 1); 
     index = word8.indexOf(word9); 
    } 
    System.out.println("No of " + word9 + " in the input is : " + occurrences); 
} 
+1

Ahhh No estaba viendo la parte del ciclo while muchas gracias. – Eric

+1

No olvide cerrar su escáner. – arshajii

11

solución interesante:

public static int countOccurrences(String main, String sub) { 
    return (main.length() - main.replace(sub, "").length())/sub.length(); 
} 

Básicamente lo que estamos haciendo aquí está restando la longitud de main de la longitud de la cadena resultante de la eliminación de todas las instancias de sub en main - que luego dividir este número por el longitud de sub para determinar cuántas ocurrencias de sub se eliminaron, dándonos nuestra respuesta.

Así que al final tendría algo como esto:

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String word8 = sc.next(); 
    String word9 = sc.next(); 
    int occurrences = countOccurrences(word8, word9); 
    System.out.println(occurrences); 

    sc.close(); 
} 
+1

+1 para la parte interesante :) – JTMon

+1

Inteligente :) Pero ['.replace'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28java .lang.CharSequence,% 20java.lang.CharSequence% 29) sería mejor ya que no usa expresiones regulares como '.replaceAll', y tiene la misma semántica que la que está usando. – Brian

+0

Sí, buen punto - arreglado. – arshajii

0

Otra opción:

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String word8 = sc.next(); 
    String word9 = sc.next(); 
    int occurences = word8.split(word9).length; 
    if (word8.startsWith(word9)) occurences++; 
    if (word8.endsWith(word9)) occurences++; 
    System.out.println(occurences); 

    sc.close(); 
} 

El startsWith y endsWith se requieren porque split() omite las cadenas vacías finales.

1

¿Por qué nadie publica la solución más obvia y rápida?

int occurrences(String str, String substr) { 
    int occurrences = 0; 
    int index = str.indexOf(substr); 
    while (index != -1) { 
     occurrences++; 
     index = str.indexOf(substr, index + 1); 
    } 
    return occurrences; 
} 
Cuestiones relacionadas