Когда я не могу использовать «список», но мне нужно сохранить входные данные со сканера, как я могу с этим справиться?
Я хочу, чтобы программа считала частоты входов, появляющихся во входах со сканера.
Например, если на входе
«Я люблю яблоко, но тоже люблю банан»
Результат
Я: 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 я должен знать размер ввода. Другие люди говорили мне использовать «список», но использование «списка» ограничено.
Что было бы в этой ситуации?




Можете ли вы использовать 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 + " ");
}
Вместо этого вы захотите использовать карту или, если вам нужно использовать массивы, массив объектов, который вам нужно заменить массивом большего размера (и скопировать старый), когда это необходимо - так же, как это делает
ArrayList. Если вы не должны использовать списки, то я предполагаю, что цель состоит в том, чтобы научить вас чему-то необходимому, чтобы вы понимали, что вам следует изучить, и рассказать нам, что это такое, если мы хотим помочь значимым образом.