Java хранит входные данные со сканера

Когда я не могу использовать «список», но мне нужно сохранить входные данные со сканера, как я могу с этим справиться?

Я хочу, чтобы программа считала частоты входов, появляющихся во входах со сканера.

Например, если на входе

«Я люблю яблоко, но тоже люблю банан»

Результат

Я: 2 как 2 яблоко: 1 банан: 1 но: 1 тоже: 1

Сначала я думал создать массивы строк, и каждый раз, когда приходит ввод, я помещал их в массив. После этого, хотя для этого потребуется временная сложность n ^ 2, запустите цикл for для каждого элемента, а затем проверьте, есть ли в нем то же слово.

    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.

Но проблема здесь ... при объявлении arr я должен знать размер ввода. Другие люди говорили мне использовать «список», но использование «списка» ограничено.

Что было бы в этой ситуации?

Вместо этого вы захотите использовать карту или, если вам нужно использовать массивы, массив объектов, который вам нужно заменить массивом большего размера (и скопировать старый), когда это необходимо - так же, как это делает ArrayList. Если вы не должны использовать списки, то я предполагаю, что цель состоит в том, чтобы научить вас чему-то необходимому, чтобы вы понимали, что вам следует изучить, и рассказать нам, что это такое, если мы хотим помочь значимым образом.

Thomas 23.10.2018 14:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
454
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Можете ли вы использовать Java потоки?

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

Или получить ввод от пользователя, например:

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

Выход:

banana: 1

but: 1

apple: 1

too: 1

like: 2

i: 2

Вы можете сделать что-то подобное, используя HashMap и перебирая входной массив в цикле for и проверяя, содержит ли уже карта ключ или нет. Если он содержит, просто увеличьте количество в значении. Если ключа еще нет на карте, просто добавьте его вместе со значением 1.

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

Наконец, просто перебирайте карту и печатайте с парами ключ и значение.

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

        }

    }

// Без java stream api. // Сохраненный вывод в Map.

Output:

banana = 1

but = 1

apple = 1

too = 1

like = 2

i = 2

Попробуйте что-нибудь вроде,

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

Другие вопросы по теме