Cuando no puedo usar la 'lista', pero necesito almacenar las entradas del escáner, ¿cómo puedo manejarla?

Quiero hacer que el programa cuente las frecuencias de las entradas que aparecen en las entradas del escáner.

Por ejemplo, si la entrada es

"Me gusta la manzana pero también me gusta el plátano"

El resultado es

I: 2 me gusta: 2 manzanas: 1 plátano: 1 pero: 1 también: 1

Al principio pensé en hacer los arreglos de cadenas, y cada vez que llega una entrada, los pongo en el arreglo. Después de eso, aunque requeriría n ^ 2 de complejidad de tiempo, ejecute el bucle for para cada elemento y luego verifique si tiene la misma palabra.

    for (String str in arr){
        for(String str_2 in arr){
             if(strr.equals(str_2)){
                    count[i]++;
             } // count is the array storing the frequencies.

Pero el problema aquí es ... al declarar el arr, debo saber el tamaño de entrada. Otras personas me dijeron que usara la "lista", pero el uso de la "lista" está restringido.

En esta situación, ¿cuál sería el camino?

0
Rhee 23 oct. 2018 a las 15:08

4 respuestas

La mejor respuesta

¿Se puede utilizar Java streams ?

String[] array = {"i", "like", "apple", "but", "i", "like", "banana", "too"};

O para obtener la entrada del usuario, algo como:

Scanner sc = new Scanner(System.in);
int numberOfEntries = sc.nextInt(); // defines how big the array should be
String[] array = new String[numberOfEntries];
for (int i = 0; i < numberOfEntries; i++) {
    System.out.println("Enter value " + (i+1));
    String word = sc.next();
    array[i] = word;
}

Arrays.stream(array).collect(Collectors.groupingBy(p -> p, Collectors.counting()))
                .entrySet().stream().forEach(key -> System.out.println(key.getKey() + ": " + key.getValue()));

Salida:

plátano: 1

pero: 1

manzana: 1

también: 1

como: 2

yo: 2

3
achAmháin 23 oct. 2018 a las 12:17

Puede hacer algo como esto usando un HashMap e iterando sobre la matriz de entrada en un bucle for y verificando si el mapa ya contiene la clave o no. Si contiene, simplemente aumente la cuenta en el valor. Si la clave aún no está en el mapa, simplemente agréguela junto con el valor 1.

for (String str : inputArray) {
    if (map.containsKey(str)) {
        map.put(str, map.get(str) + 1);
    } else {
        map.put(str, 1);
    }
}

Finalmente, solo itere sobre el mapa e imprima con pares de clave y valor.

0
Ankur Chrungoo 23 oct. 2018 a las 12:24
  String input = "I like apple but I like banana too";
    String[] words = input.split(" ");
    int countfre=0;
    HashMap<String,Integer> map = new HashMap<String, Integer>();
    for(int i=0;i<words.length;i++){
        if(!map.containsKey(words[i])){
            for (int j=0;j<words.length;j++){
                if(words[i].equalsIgnoreCase(words[j])){
                    countfre++;
                }
                map.put(words[i],countfre);

            }
            countfre=0;
            System.out.println(words[i] + " = " +map.get(words[i]));

        }

    }

// Sin Java Stream API. // Salida almacenada en el mapa.

Salida:

plátano = 1

pero = 1

manzana = 1

también = 1

como = 2

i = 2

0
Syed Hamza Hassan 23 oct. 2018 a las 12:25

Intenta algo como

public static void main(String[] args) {
        //input
        String s = "I like apple but I like banana too";
        //desired output
        //I: 2 like: 2 apple: 1 banana: 1 but: 1 too: 1

        String[] str = s.split(" ");
        String[] result = new String[str.length];
        int temp = 0;

        test:
        for (String str1 : str) {

            for (String str2 : result) {
                if(str1.equals(str2)){
                    continue test;
                }
            }
            result[temp++] = str1;
            int count = 0;
            for (String str2 : str) {
                 if(str1.equals(str2)){
                     count++;
                 }
            }
            System.out.print(str1 + ": " + count + " ");
        }
0
Akhil Punalur 23 oct. 2018 a las 12:40