Search code examples
javastringsplitindexoutofboundsexception

split returns a string in place of string array


Whenever I try to read a string in java and split it to get an array of strings by using String[] part=str.split(" "),it returns a single array in place of returning an array of strings i.e., part. length=1 and thus when accessed gives out an ArrayIndexOutOfBoundException.

here is the code I am working on currently:

import java.io.*;
import java.util.*;
public static void main(String[] args)
{
    InputReader in = new InputReader(System.in);
    String s=in.readString();
    String[] str=s.split(" ");
    for(int i=0;i<str.length;i++)
        System.out.println(str[i]);
}
private static class InputReader
{
    private InputStream stream;
    private byte[] buf = new byte[1024];
    private int curChar;
    private int numChars;
    private SpaceCharFilter filter;

    public InputReader(InputStream stream)
    {
        this.stream = stream;
    }

    public int read()
    {
        if (numChars == -1)
            throw new InputMismatchException();
        if (curChar >= numChars)
        {
            curChar = 0;
            try
            {
                numChars = stream.read(buf);
            } catch (IOException e)
            {
                throw new InputMismatchException();
            }
            if (numChars <= 0)
                return -1;
        }
        return buf[curChar++];
    }

    public int readInt()
    {
        int c = read();
        while (isSpaceChar(c))
            c = read();
        int sgn = 1;
        if (c == '-')
        {
            sgn = -1;
            c = read();
        }
        int res = 0;
        do
        {
            if (c < '0' || c > '9')
                throw new InputMismatchException();
            res *= 10;
            res += c - '0';
            c = read();
        } while (!isSpaceChar(c));
        return res * sgn;
    }

    public String readString()
    {
        int c = read();
        while (isSpaceChar(c))
            c = read();
        StringBuilder res = new StringBuilder();
        do
        {
            res.appendCodePoint(c);
            c = read();
        } while (!isSpaceChar(c));
        return res.toString();
    }
    public double readDouble() {
        int c = read();
        while (isSpaceChar(c))
            c = read();
        int sgn = 1;
        if (c == '-') {
            sgn = -1;
            c = read();
        }
        double res = 0;
        while (!isSpaceChar(c) && c != '.') {
            if (c == 'e' || c == 'E')
                return res * Math.pow(10, readInt());
            if (c < '0' || c > '9')
                throw new InputMismatchException();
            res *= 10;
            res += c - '0';
            c = read();
        }
        if (c == '.') {
            c = read();
            double m = 1;
            while (!isSpaceChar(c)) {
                if (c == 'e' || c == 'E')
                    return res * Math.pow(10, readInt());
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                m /= 10;
                res += (c - '0') * m;
                c = read();
            }
        }
        return res * sgn;
    }
    public long readLong() {
        int c = read();
        while (isSpaceChar(c))
            c = read();
        int sgn = 1;
        if (c == '-') {
            sgn = -1;
            c = read();
        }
        long res = 0;
        do {
            if (c < '0' || c > '9')
                throw new InputMismatchException();
            res *= 10;
            res += c - '0';
            c = read();
        } while (!isSpaceChar(c));
        return res * sgn;
    }
    public boolean isSpaceChar(int c)
    {
        if (filter != null)
            return filter.isSpaceChar(c);
        return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
    }

    public String next()
    {
        return readString();
    }

    public interface SpaceCharFilter
    {
        public boolean isSpaceChar(int ch);
    }
   }
}

For example , whenever I write "hello I am here" it must print "hello" , "I" ,"am" and "here" in 4 separate lines ideally rather in my case it prints only "hello" .

How to resolve this issue?

enter image description here


Solution

  • The readString method is just reading up to a space, that is, just the next word - here respective part from your code (thsi is NOT a solution, just copy&paste from the code that is not working):

    public String readString()
    {
        ...  // ignore spaces at start
        do
        {
            res.appendCodePoint(c);
            c = read();
        } while (!isSpaceChar(c));  // STOPS reading if it got a space
        return res.toString();
    }
    

    no need to call split since InputReader is already doing the job.

    But is InputReader really needed? Have a look at the Scanner class.