Напишите функцию, которая принимает строку и возвращает массив слов
Напишите функцию, которая принимает строку и возвращает массив слов.
Под словом подразумеваются множество символов отличных от пробела. Между словами может стоять больше одного пробела.
Делаю что-то не так - потому что выводит ошибку: [Ljava.lang.String;@ Может кто-нибудь знает где я ошибаюсь....может совсем решение неверное. хотя по логике. вроде получаю слово..
Вот мой код
public static String[] split(String s){
String [] array = s.split(" ");
for (int i = 0; i < array.length; i++) {
String word = array[i];
}
return array;
}
public static void main(String[] args) {
String s = "I am learning java";
System.out.println(split(s));
}
Подскажите пожалуйста, где именно я не верно пишу код или пишу его не до конца
Текст ошибки: [Ljava.lang.String;@568db2f2
Ответы (1 шт):
Это вовсе не ошибка, это вывод Вашего результата. Дело в том, что Java не умеет выводить массив в том виде, в котором Вы хотите. Если попытаться вывести объект массива просто через System.out.println();, он выводит некое описание объекта.
Во-первых, нужно из метода split удалить ненужный цикл, который не делает ничего.
Во-вторых, нужно сделать вывод всех полученных слов через цикл.
public class Main
{
public static String[] split(String s){
String [] array = s.split(" ");
return array;
}
public static void main(String[] args) {
System.out.println("Hello World");
String s = "I am learning java";
// Сохраняем результат разделения
String[] words = split(s);
// Перебираем каждый элемент массива
for(String word : words) {
System.out.println(word);
}
}
}
UPD:
Чтобы решение удовлетворяло условию того, что может быть несколько пробелов подряд нужно отфильтровать то, что вернёт метод String.split(), так как, при разделении по пробелам строки, содержащей множество пробелов, она вернёт массив, где будут тоже пробелы.
Приведу следующее решение. нужно импортировать пакет import java.util.*;
Далее, то, что возвращает метод s.split(" ") приводим к листу и этот лист фильтруем, посредством вызова метода filter((x -> !x.isEmpty()), что означает, вернуть только не пустые элементы списка (листа). Далее уже приводим результат к массиву строк toArray(String[]::new) и этот результат уже возвращаем.
import java.util.*;
public class Main
{
public static String[] split(String s){
List<String> words = Arrays.asList(s.split(" "));
String[] filtered = words.stream().filter((x -> !x.isEmpty())).toArray(String[]::new);
return filtered;
}
public static void main(String[] args) {
System.out.println("Hello World");
String s = "I am learning java many spaces";
// Сохраняем результат разделения
String[] words = split(s);
// Перебираем каждый элемент массива
for(String word : words) {
System.out.println(word);
}
}
}
Теперь даже на строку с множеством пробелом между словами "I am learning java many spaces" он вернёт массив строк, который содержит только отдельные слова.
Более тривиальное решение, без использования лямбда-функциий, но с использованием коллекций, а конкретнее, ArrayList - динамического массива.
import java.util.ArrayList;
public class Main
{
public static String[] split(String s){
// сначала разделяем по пробелу и получаем массив
String[] splitted = s.split(" ");
// Далее, создаём пустой лист
ArrayList<String> words = new ArrayList<String>();
for (String row : splitted) {
// проверяем каждое значение, не пустое ли оно и сохраняем только слова
if (!row.isEmpty()) words.add(row);
}
String[] result = new String[words.size()];
words.toArray(result);
return result;
}
public static void main(String[] args) {
System.out.println("Hello World");
String s = "I am learning java many spaces";
// Сохраняем результат разделения
String[] words = split(s);
// Перебираем каждый элемент массива
for(String word : words) {
System.out.println(word);
}
}
}
Ну и в итоге - самое примитивное решение, без использования сложных методов, коллекций и лямбда-выражений, но с лишними циклами и дейсвтиями по подсчёту слов.
public class Main
{
public static String[] split(String s){
String[] splitted = s.split(" ");
int wordsNumber = 0;
for (String row : splitted) {
// Подсчитываем сколько слов, без учёта пробелов
if (!row.isEmpty()) wordsNumber++;
}
String[] words = new String[wordsNumber];
int i = 0;
for (String row : splitted) {
// Теперь их сохраняем в массив слов
if (!row.isEmpty()) {
words[i] = row;
i++;
}
}
return words;
}
public static void main(String[] args) {
System.out.println("Hello World");
String s = "I am learning java many spaces";
// Сохраняем результат разделения
String[] words = split(s);
// Перебираем каждый элемент массива
for(String word : words) {
System.out.println(word);
}
}
}