Использование метода split класса String в Java

177
02 июля 2018, 18:30

В данный момент изучаю по книгам Ввод-Вывод. Задача такая необходимо получить из потока ввода с клавиатуры 2-а числовых значения, которые при вводе разделяются пробелами. После чего выполнить проверку являются ли они целочисленными значениями типа int, с помощью метода parseInt конвертировать их в int и отправить эти значения дальше в программу. С проверкой вопросов не возникло. Ввод я решил реализовать c помощью метода readLine через InputStreamReader упакованный в BufferedReader. С этим тоже не возникло проблем. Вопрос возник при разбиении строки на подстроки с помощью метода split() по пробелам. Задумка была такая, что разбитая на подстроки строка записывается в строковый массив и первые два элемента этого массива передаются в созданный для проверки метод.

Когда я ввожу только одно значение без пробелов, split нечего разделять и он как я понял записывает только один элемент массива. При попытке в цикле вывести 2-а значения на экран, выдаёт ошибку выхода за границы массива. Переменную с ссылкой на этот массив я создал в самом начале.

Собственно вопрос: рассуждая логически и читая мануалы. я пришёл к выводу, что метод split() создаёт свой массив по количеству подстрок и ссылку на него записывает в ранее созданную мной переменную. Так так ли это и как можно ещё реализовать данную операцию?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main
{
    static String[] buff = new String[2];
    public static void main(String[] args)
    {
        String edata;
        CheckInt checkInt;
        try(BufferedReader read = new BufferedReader(new InputStreamReader(System.in));)
        {
                edata = read.readLine();
                buff = edata.split(" ");
                for (int i=0; i<2; i++)
                {
                    System.out.println(buff[i]);
                }
        }
        catch(IOException exc)
        {
            System.out.print("Ошибка ввода вывода");
        }
    }
}
Answer 1

У вас цикл состоит из двух итераций при i = 0 и i = 1. При массиве из одного элемента он обращается к нулевому элементу, а при обращении к первому вылетает исключение. Кто вам мешает сделать в цикле ограничение не хардкоженное (фиксированное):

for (int i=0, end = buff.length; i<end; i++)

и вводите хоть сто значений, хоть ноль.

Answer 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main
{
    public final static int SIZE=2;
    static String[] buff;
    public static void main(String[] args)
    {
        String[] temp = new String[SIZE];
        String edata;
        CheckInt checkInt = new CheckInt();
        try(BufferedReader read = new BufferedReader(new InputStreamReader(System.in));)
        {
            System.out.print("Введите координаты: ");
            do
            {
                edata = read.readLine();
                buff = edata.split(" ");
                for (int i = 0; i < buff.length & i < temp.length; i++)
                {
                    temp[i] = buff[i];
                }
                System.out.println();
                for (int i = 0; i < temp.length; i++)
                {
                    System.out.println(checkInt.check(temp[i]));
                }
            }while(!(checkInt.check(temp[0]) & checkInt.check(temp[1])));
        }
        catch(IOException exc)
        {
            System.out.print("Ошибка ввода вывода");
        }
    }
}

Пока смог придумать только это, вопрос состоит в том можно ли заставить split() писать в уже существующий массив или он в любом случае создаёт свой?

Answer 3

А что мешает написать??

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class tet {
    public static void main(String[] args) {
        BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
    try {
        String edata = read.readLine();
        for(String temp : edata.split(" ")){
            System.out.println(temp);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

В итоге получил

2 5
2
5
READ ALSO
Получение данных через Message&lt;String&gt; ( io.vertx.core.eventbus)

Получение данных через Message<String> ( io.vertx.core.eventbus)

Как передать параметр метода Message<String> msg в обычный Set метод?

138
Циклическое авто фотографирование

Циклическое авто фотографирование

Никак не получается сделать автофотографирование с заданным числом фотоЕсли использовать для фото метод onClick и нажимать несколько раз - всё...

167
Синхронизация подписки на Observable

Синхронизация подписки на Observable

друзья, нужна ваша помощь о работе с асинхронщиной знаю только теорию, на практике не работал работаю с mongodb-async-driver + mongodb-driver-rx у меня есть...

169