Splitting a comma and space separated input into two words - java

I am having difficulty splitting a string of user input into two words. The string is in the format "word1, word2", and I am trying to create two separate strings of word1 and word2. Here is my attempt:
System.out.println("Enter the two words separated by a comma, or 'quit':");
Scanner sc = new Scanner(System.in);
String input = sc.next();
while(!input.equals("quit")){
input.replaceAll("\\s+","");
System.out.println(input); //testing
int index1 = input.indexOf(",");
String wordOne = input.substring(0, index1);
String wordTwo = input.substring(index1+1, input.length() );
if(wordOne.length()!=wordTwo.length()){
System.out.println("Sorry, word lengths must match.");
}
System.out.println("Enter the two words separated by a comma, or 'quit':");
input = sc.next();
}
This is the output:
Enter the two words separated by a comma, or 'quit':
leads, golds
leads,
Sorry, word lengths must match.
Enter the two words separated by a comma, or 'quit':
golds
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1911)
at Solver.main(Solver.java:22) //this points to the line "String wordOne = input.substring(0, index1);"
Could someone please tell me where I am going wrong?

Why don't you try:
input.split(",");
This will give you an String array. From JavaDocs.
public String[] split(String regex)
Splits this string around matches of the given regular expression.
This method works as if by invoking the two-argument split method with
the given expression and a limit argument of zero. Trailing empty
strings are therefore not included in the resulting array.
Update: Since, you are using sc.next() which will take a single word unless it sees a space at which it will terminate the input. You should instead use sc.nextLine() to keep the complete input as user inputs.
next()
public java.lang.String next()
Finds and returns the next complete
token from this scanner. A complete token is preceded and followed by
input that matches the delimiter pattern. This method may block while
waiting for input to scan, even if a previous invocation of hasNext
returned true.
nextLine()
public java.lang.String nextLine()
Advances this scanner past the
current line and returns the input that was skipped. This method
returns the rest of the current line, excluding any line separator at
the end. The position is set to the beginning of the next line. Since
this method continues to search through the input looking for a line
separator, it may buffer all of the input searching for the line to
skip if no line separators are present.

The problem is that you are using sc.next() instead of sc.nextLine(). I can see that in your input you are entering "leads, gold" where leads, is followed by a space. In this case sc.next() will return just "leads," and not "leads, gold"

Related

Java (Length of an input)

So I want to get the length of the input in java, but the (String.length()) doesn't produce a satisfying result.
So when I type this code:
String c = "hi hello";
System.out.print(c.length());
I get 8 which is correct
but when I type this code:
Scanner s = new Scanner(System.in);
String c = s.next();
System.out.print(c.length());
For "hi hello" is the input, I get 2 not 8. I tried again with different inputs and I found that string.length() have a problem with spaces in inputs. for example, if the input was "123456 78" the output would be 6 not 9. Can you tell me how to get the full length of the input? Thanks in advance
Replace s.next() to s.nextLine() and you will get the desired result.
next() finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern.
nextLine() returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.
-> "123456 78"
s.next().length() -> "123456".length() -> 6
s.nextLine().length() -> "123456 78".length() -> 9
Use nextLine() rather than next() as next() can read the input only till the space.
nextLine() reads input including space between the words (that is, it reads till the end of line \n)
Scanner s = new Scanner(System.in);
String c = s.nextLine();
System.out.print(c.length());
The java.util.Scanner.next() method finds and returns the next
complete token from this scanner. A complete token is preceded and
followed by input that matches the delimiter pattern.
The delimiter here is " ".
You get 2 as length because it says the length of "hi" is 2. If you
want the length of complete string use nextLine() it counts upto "\n"

How to split a string with space being the delimiter using Scanner

I am trying to split the input sentence based on space between the words. It is not working as expected.
public static void main(String[] args) {
Scanner scaninput=new Scanner(System.in);
String inputSentence = scaninput.next();
String[] result=inputSentence.split("-");
// for(String iter:result) {
// System.out.println("iter:"+iter);
// }
System.out.println("result.length: "+result.length);
for (int count=0;count<result.length;count++) {
System.out.println("==");
System.out.println(result[count]);
}
}
It gives the output below when I use "-" in split:
fsfdsfsd-second-third
result.length: 3
==
fsfdsfsd
==
second
==
third
When I replace "-" with space " ", it gives the below output.
first second third
result.length: 1
==
first
Any suggestions as to what is the problem here? I have already referred to the stackoverflow post How to split a String by space, but it does not work.
Using split("\\s+") gives this output:
first second third
result.length: 1
==
first
Change
scanner.next()
To
scanner.nextLine()
From the javadoc
A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace.
Calling next() returns the next word.
Calling nextLine() returns the next line.
The next() method of Scanner already splits the string on spaces, that is, it returns the next token, the string until the next string. So, if you add an appropriate println, you will see that inputSentence is equal to the first word, not the entire string.
Replace scanInput.next() with scanInput.nextLine().
The problem is that scaninput.next() will only read until the first whitespace character, so it's only pulling in the word first. So the split afterward accomplishes nothing.
Instead of using Scanner, I suggest using java.io.BufferedReader, which will let you read an entire line at once.
One more alternative is to go with buffered Reader class that works well.
String inputSentence;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
inputSentence=br.readLine();
String[] result=inputSentence.split("\\s+");
rintln("result.length: "+result.length);
for(int count=0;count<result.length;count++)
{
System.out.println("==");
System.out.println(result[count]);
}
}

Deliminter is not working for scanner

The user will enter a=(number here). I then want it to cut off the a= and retain the number. It works when I use s.next() but of course it makes me enter it two times which I don't want. With s.nextLine() I enter it once and the delimiter does not work. Why is this?
Scanner s = new Scanner(System.in);
s.useDelimiter("a=");
String n = s.nextLine();
System.out.println(n);
Because nextLine() doesn't care about delimiters. The delimiters only affect Scanner when you tell it to return tokens. nextLine() just returns whatever is left on the current line without caring about tokens.
A delimiter is not the way to go here; the purpose of delimiters is to tell the Scanner what can come between tokens, but you're trying to use it for a purpose it wasn't intended for. Instead:
String n = s.nextLine().replaceFirst("^a=","");
This inputs a line, then strips off a= if it appears at the beginning of the string (i.e. it replaces it with the empty string ""). replaceFirst takes a regular expression, and ^ means that it only matches if the a= is at the beginning of the string. This won't check to make sure the user actually entered a=; if you want to check this, your code will need to be a bit more complex, but the key thing here is that you want to use s.nextLine() to return a String, and then do whatever checking and manipulation you need on that String.
Try with StringTokenizer if Scanner#useDelimiter() is not suitable for your case.
Scanner s = new Scanner(System.in);
String n = s.nextLine();
StringTokenizer tokenizer = new StringTokenizer(n, "a=");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
or try with String#split() method
for (String str : n.split("a=")) {
System.out.println(str);
}
input:
a=123a=546a=78a=9
output:
123
546
78
9

Problems with counting spaces - Java

I'm having problems with the code below. It asks for the user to type in a sentence basically.
System.out.println("Enter a string containing spaces: ");
inputString = keyboard.next();
int lengthString = inputString.length();
System.out.println("You entered: " + inputString + "\n" + "The string length is: " + lengthString);
The problem is when it prints the statement, it only prints the first word, then counts the characters contained within the first word. I'm really new to Java, so I was wondering what should I do to make the program count the WHOLE string.
You should use nextLine() method instead of next():
inputString = keyboard.nextLine();
Scanner#next() method reads the next token. Tokens are considered to be separated by a delimiter. And the default delimiter of Scanner is as recognized by Character.isWhitespace.
keyboard.nextLine() will pull in the entire line. next() only gets the next word. next() uses spaces by default to determine word sizes, but you can also set a custom delimiter if you want it to pull in different tokens.

Split method not working as expected

I tried to use a Split Function to separate the input String by Space character into a String Array but nothing happened.
I used this code:
String a;
String[] b = new String[4];
a=input.next(); // input : 1 2 3 4
b=a.split(" "); // or b=a.split("\\s+");
/* output : b[0]=1 , b[1]=Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
*/
But when I defined a value like this:
String a="1 2 3 4";
Everything is done successfully.
What should I do?
Assuming input is a Scanner...
The next() method will return the next token, and by default, Scanner separates input by whitespace. You don't need to split the input when Scanner is tokenizing the input for you already.
A Scanner breaks its input into tokens using a delimiter pattern,
which by default matches whitespace. The resulting tokens may then be
converted into values of different types using the various next
methods.
Alternatively, you could use input.nextLine() to get the entire line, then you can split the line yourself.

Categories