Can someone tell me what I am doing wrong here? I'm trying to display the position of asterisks but i keep getting 1 in return.
package proj2;
import java.util.Scanner;
/**
* <p> Title: Project 2: String Manipulation </p>
* <p> Description: Ask the user to enter a URL and it will display
* the protocol, domain name and file name specified. </p>
* #author Mario Mendoza
*
*/
public class Project2 {
/**
*
* #param args arguments
*/
public static void main(String[] args ) {
Scanner s = new Scanner(System.in );
String sentence;
String word1;
String word2;
String word3;
String word4;
String asterisks1 = "*";
String asterisks2 = "*";
String asterisks3 = "*";
int firstWord;
int secondWord;
int thirdWord;
int fouthWord;
int wordLength1;
int wordLength2;
int wordLength3;
int wordLength4;
int positionOfAsterisks1;
int positionOfAsterisks2;
int positionOfAsterisks3;
char firstLetter;
int total;
word1 = s.next();
word2 = s.next();
word3 = s.next();
word4 = s.next();
System.out.println("You typed " + word1 + asterisks1 + word2 + asterisks2 + word3 + asterisks3 + word4);
sentence = new String(word1 + asterisks1 + word2 + asterisks2 + word3 + asterisks3 + word4);
wordLength1 = word1.length();
System.out.println(word1 + " has length " + wordLength1);
wordLength2 = word2.length();
System.out.println(word2 + " has length " + wordLength2);
wordLength3 = word3.length();
System.out.println(word3 + " has length " + wordLength3);
wordLength4 = word4.length();
System.out.println(word4 + " has length " + wordLength4);
positionOfAsterisks1 = sentence.indexOf(asterisks1);
positionOfAsterisks2 = sentence.indexOf(asterisks2);
positionOfAsterisks3 = sentence.indexOf(asterisks3);
System.out.println("The asterisks were found at position " + positionOfAsterisks1 + ", " + positionOfAsterisks2 + ", and " + positionOfAsterisks3);
}
}
Have your program perform the following tasks:
Prompt the user to enter a String containing exactly four words, separated only
by asterisks. The input string should not have any spaces. An example of the kind
of input this program will receive is I*love*computer*science. Display the
user’s input (as a confirmation to the user that the program understood the input).
Store each of the four words separately.
Display each word with its length. For example:
I has length 1.
love has length 4.
computer has length 8.
science has length 7.
Display the position of the asterisks in the original string. For example:
The asterisks were found at positions 1, 6, and 15.
Display the last letter of the first word.
Display the total aggregate length of the four words.
In addition, be sure to include a JavaDoc comment at the top of the file, that include’s the
program’s title, description, and author’s name.
4 Sample Run
You typed I*love*computer*science.
I has length 1.
love has length 4.
computer has length 8.
science has length 7.
The asterisks were found at positions 1, 6, and 15.
The last letter of the first word is I.
The total aggregate length of the four words is 20 letters.
public static void main(String[] args ) {
Scanner s = new Scanner(System.in );
String sentence;
String word1;
String word2;
String word3;
String word4;
word1 = s.next();
word2 = s.next();
word3 = s.next();
word4 = s.next();
System.out.println("You typed " + word1 + "*" + word2 + "*" + word3 + "*" + word4);
sentence = new String(word1 + "*" + word2 + "*" + word3 + "*" + word4);
System.out.println(word1 + " has length " + word1.length());
System.out.println(word2 + " has length " + word2.length());
System.out.println(word3 + " has length " + word3.length());
System.out.println(word4 + " has length " + word4.length());
System.out.print("The asterisks were found at position ");
// get the position of * and store the position index
int i = 0;
String positionOfAsterisks = "";
while (i < sentence.length()){
if (sentence.charAt(i) == '*')
positionOfAsterisks += i + ", ";
i++;
}
// remove the last comma and empty space then add in full stop
positionOfAsterisks = positionOfAsterisks.substring(0, positionOfAsterisks.length()-2);
positionOfAsterisks += "." ;
System.out.print(positionOfAsterisks);
}
Instead of using indexOf, I use a loop to iterate through your 'sentence'. Also, I removed the declaration of useless variables.
IndexOf will return just the index it found from the first index (if it's not stated in the 2nd arg of the method). And IndexOf method return the first position as 1 instead of 0.
The problem is that you are always searching in the given string for the same value, which is *. It doesn't matter what you name the variable, you are essentially running this line 3 times:
positionOfAsterisks1 = sentence.indexOf('*'); using 3 different variables, but each time it will always return 1. This is because each time it starts over, hits the first asterisk, and returns true.
What you need to do is make use of the second argument, which is the position to start from.
positionOfAsterisks1 = sentence.indexOf(asterisks1);
int temp = positionOfAsterisks1 + 1;
positionOfAsterisks2 = sentence.indexOf(asterisks1,temp);
temp = positionOfAsterisks2 + 1;
positionOfAsterisks3 = sentence.indexOf(asterisks1,temp);
What this does
The first line returns a value of 1. The next line sets temp to 2. Now the search starts from the third position (since array indices start at 0), and will thus not include the first asterisk. It will then hit the 7th character which is * and return 6. Again temp is set to 7, and again the search starts from the 8th character, and goes on till it hits the asterisk again at 15.
Note
You do not need to use 3 separate variables to hold the same *, it is only a waste of space. I would recommend using the same variable and eliminating the other two!
Related
I am writing this little section for a program I'm gonna write for initials of a name in java, and I need to determine the position of each space in it to be able to choose the initials. I'm testing it to make sure the spaces are been seen in the right position in the line, but for some reason, the position always comes wrong! Please help me.
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("please enter full name:");
String name = in.nextLine();
int space = name.indexOf(" ");
int space1 = name.indexOf(" ", space) + space+1;
int space2 = name.indexOf(" ", space1) + space1+1;
int space3 = name.indexOf(" ", space2) + space2+1;
int space4 = name.indexOf(" ", space3) + space3+1;
int space5 = name.indexOf(" ", space4) + space4+1;
System.out.println(space + " " + space1 + " " + space2 + " " + space3 + " " + space4);
}
}
My idea using this line was to count up to each part of the line space that shows up after the last one and add 1 because java starts counting at 0.
(" ", space1) + space1+1;
Basically, if the name is "Jeff Luiz Jeff Luiz" the first space is at 4 and the next one is at 9, so it would the 4, then proceed to count after this space, starting at 0, which would find 4 again(because Luiz has the same amount of letters), sum up with the last space number to keep track of the real position(then it would be 8), and finally sum up with 1 because of how java works, and so on. When I ran these 4 words I found the result 4 9 19 19 19. Does anyone know what is the problem with my code?
Replace
int space1 = name.indexOf(" ", space) + space+1;
with
int space1 = name.indexOf(" ", space + 1);
because String#indexOf(String str, int fromIndex) returns the index within this string of the first occurrence of the specified substring, starting at the specified index.
Demo:
public class Main {
public static void main(String[] args) {
String name = "Arvind Kumar Avinash";
int space = name.indexOf(" ");
int space1 = name.indexOf(" ", space + 1);
System.out.println(space + ", " + space1);
}
}
Output:
6, 12
int lastSpace = fullName.lastIndexOf(" ");
here all the code
import java.util.Scanner;
public class java_13 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter your full name");
String fullName = input.nextLine();
int firstSpace = fullName.indexOf(" ");
String firstName = fullName.substring(0, firstSpace);
int lastSpace = fullName.lastIndexOf(" ");
String lastName = fullName.substring(lastSpace + 1);
System.out.println("\n" + lastName + ", " + firstName);
also why we use ( +1 )
here
String lastName = fullName.substring(lastSpace + 1);
Because the space divides firstName and lastName.
The input is supposed to look like "firstName lastName". If you take the position of the " " space from it, then the "lastName" part begins on the next character, hence the +1 to the position for getting the substring.
In Java, the index starts with 0.
For example :
String name = "Moataz Mohamed";
name[0]='M';
name[1]='o';
...
name[6]=' '; //Space
Space separates First name and Last name.
Hence,
0 to index[" "]-1 is First name
index[" "]+1 to length() is Second name
Hope its clear now.
Here the full name is composed of a first name and the last name, this code search the first blank space in order to separate the first name from the last name
But I recommend allowing the user to enter both of the last and the first name instead of the full name because it is impossible to know how much words compose the first name and the same thing for the last name.
As #0x01 mentioned, you get the index of the space, but in last name is beginning at position with index +1, that is the reason, just check this outputs
{...}
public static final String NAME1 = "Julian Papadopulos";
public static final String NAME2 = "John von Bahnhof";
public static final char SPLITCHAR = ' ';
{...}
public static void splitNamesBySpaceIndex() {
// name1
int firstSpace = NAME1.indexOf(" ");
int lastSpace = NAME1.lastIndexOf(" ");
String firstName = NAME1.substring(0, firstSpace);
String lastName = NAME1.substring(lastSpace + 1);
System.out.println("lastname: \'" + lastName + "\', firstname: \'" + firstName + "\'");
lastName = NAME1.substring(lastSpace);
System.out.println("lastname: \'" + lastName + "\', firstname: \'" + firstName + "\'");
}
Output looks like:
lastname: 'Papadopulos', firstname: 'Julian'
lastname: ' Papadopulos', firstname: 'Julian'
As you can see, in the second case you will parse last name like ' Papadopulos', which is not correct, its caused by taking start index the index of the space- this is the reason, why you need position with index +1.
This is like this...
FIRSTNAME LASTNAME
012345678901234567
FIRSTNAME Starts from 0
Index of " " is 9
LASTNAME Starts from 10
That is why you need to add (+1) here
indexOf(" ") {9} but you have to start with LASTNAME which is at 10
If you do not add (+1) then Output will be " LASTNAME"
I can't find an answer about this exception. THe program is very simple but, i don't know why is incorrect.
/**
* Program selects the first word from the sentence "Hello, my dear!" with
* the String Classes's methods this.indexOf() and this.substring()
*
*
* Last modify: 29th October 2015
*/
public class TakeSubstringWanted {
public static void main(String[] args) {
String sentence = "Hello, my dear!";
String reference = "Hello";
System.out.println("The sentence is: " + sentence);
System.out.println("You want to take the first word of that sentence");
System.out.println("Give me a second...");
int firstReference = sentence.indexOf(reference);
int firstLength = reference.length();
System.out.println("The first reference of the searched word is " + firstReference);
System.out.println("The first word of the sentence " + sentence + " is: " + "\"" + sentence.substring(firstReference, firstLength) + "\"");
int secondReference = sentence.indexOf("my");
System.out.println("The second reference of the searched word is " + secondReference);
int secondLength = "my".length();
System.out.println(secondLength);
System.out.println(sentence);
System.out.println("The second word of the sentence " + sentence + " is: " + "\"" + sentence.substring(secondReference, secondLength) + "\"");
}
}
Your problem is in the last line:
System.out.println("The second word of the sentence " + sentence + " is: "
+ "\"" + sentence.substring(secondReference, secondLength) + "\"");
because your secondReference = 7 and secondLength = 2, however if you look at the documentation for substring method:
public String substring(int beginIndex,
int endIndex)
Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.
...
Throws:
IndexOutOfBoundsException - if beginIndex or endIndex are negative, if endIndex is greater than length(), or if beginIndex is greater than startIndex
Meaning, you're asking substring to return a string from index 7 to index 2, which causes an IndexOutOfBoundsException. What you probably meant to do was:
sentence.substring(secondReference, secondReference + secondLength)
Your Problem is here:
sentence.substring(secondReference, secondLength)
Your giving to lengths but it should be
sentence.substring(startIndex, endIndex);
Hope that helps!
your last substring starts at pos 7 and the end index is 2, which is not possible. The last index is the end index, not the length of the char you like to take
sentence.substring(secondReference, seconfReference+secondLength);
would it be then
The second parameter of substring is the end index, not the number of characters to take.
sentence.substring(secondReference, secondLength)
When you run this, secondLength is 2 (the length of "my"), but secondReference is 7, greater than 2, resulting in such an exception.
If you want those two characters, you'd need to use:
sentence.substring(secondReference, secondLength+secondReference)
when you are using sentence.substring() for second time the second parameter of substring method should be greater than first parameter..in your case the first parameter is 7 and second parameter is 2 ...thats why you are getting String index out of range: -5
Instead of giving the length, you have to give the end index. The substring method works like:
substring(int beginIndex, int endIndex)
Change
int firstLength = reference.length();
int secondLength = "my".length();
to
int firstLength = sentence.indexOf(",");
int secondLength = sentence.indexOf(" dear");
Try this:
String sentence = "Hello, my dear!";
String reference = "Hello";
System.out.println("The sentence is: " + sentence);
System.out.println("You want to take the first word of that sentence");
System.out.println("Give me a second...");
int firstReference = sentence.indexOf(reference);
int firstLength = sentence.indexOf(",");
System.out.println("The first reference of the searched word is " + firstReference);
System.out.println("The first word of the sentence " + sentence + " is: " + "\"" + sentence.substring(firstReference, firstLength) + "\"");
int secondReference = sentence.indexOf("my");
System.out.println("The second reference of the searched word is " + secondReference);
int secondLength = sentence.indexOf(" dear");
System.out.println(secondLength);
System.out.println(sentence);
System.out.println("The second word of the sentence " + sentence + " is: " + "\"" + sentence.substring(secondReference, secondLength) + "\"");
I am making a Lipogram program where any words with the banned letter are printed, however, the words are sometimes printed twice. How do I get it to not repeat the words?
Here is my code:
public String allWordsWith(char letter) {
String str = "";
String word = "";
s = s.replace(".", " ");
s = s.replace(",", " ");
s = s.replace("?", " ");
s = s.replace("!", " ");
s = " " + s + " ";
for (int i = 0; i <= s.lastIndexOf(letter); i++) {
if (s.charAt(i) == letter) {
if (str.contains(s.substring(s.lastIndexOf(" ", i), s.lastIndexOf(" ", i) + 1) + '\n') == true) {
} else {
word += s.substring(s.lastIndexOf(" ", i), s.indexOf(" ", i)) + '\n';
str += word;
}
}
}
return str;
}
Important clarification: Is the function run with the letter chosen as "o" on the string "hello hi hello howdy" meant to return "hello hello howdy" or "hello howdy". I.e., if the word appears twice, do you want to print it twice, or do you only want to print it once regardless of repetition?
If only once regardless of repetition, then you should be using a Set to store your data.
However, I think there's a chance you're instead dealing with an issue that when running the function with the letter chosen as "l" on that same string, "hello hi hello howdy", you are getting an output of "hello hello hello hello". Correct?
The issue here is that you are checking every letter and not testing each word. To fix this, I would use:
String[] words = s.split(" ");
to create an array of your words. Test each value in that array to see if it contains the given letter using:
if(words[index].contains(letter)){
str += " " + words[index];
}
String fullWord;
String firstWord;
String secondWord;
String thirdWord;
String fourthWord;
int firstPositionOfAsterisk;
int secondPositionOfAsterisk;
int thirdPositionOfAsterisk;
int fullWordCharacters;
int firstWordCharacters;
int secondWordCharacters;
int thirdWordCharacters;
int fourthWordCharacters;
char lastLetterFirstWord;
// I will prompt the user to enter four words seperated by a *
fullWord = JOptionPane.showInputDialog("Please enter four words: ");
// I will use the position of the * to make things easier
firstPositionOfAsterisk = fullWord.indexOf("*");
firstWord = fullWord.substring(0, firstPositionOfAsterisk);
secondPositionOfAsterisk = firstWord.indexOf("*");
secondWord = fullWord.substring(firstPositionOfAsterisk + 1, secondPositionOfAsterisk);
thirdPositionOfAsterisk = secondWord.indexOf("*");
thirdWord = fullWord.substring(secondPositionOfAsterisk + 1, thirdPositionOfAsterisk);
fourthWord = fullWord.substring(thirdPositionOfAsterisk + 1);
firstWordCharacters = firstWord.length();
System.out.println(firstWord +" has a length of " + firstWordCharacters + " characters" );
secondWordCharacters = secondWord.length();
System.out.println(secondWord +" has length of " + secondWordCharacters + " characters" );
thirdWordCharacters = thirdWord.length();
System.out.println(thirdWord +" has length of " + thirdWordCharacters + " characters" );
fourthWordCharacters = fourthWord.length();
System.out.println(fourthWord +" has length of " + fourthWordCharacters + " characters" );
lastLetterFirstWord = firstWord.charAt(firstPositionOfAsterisk - 1);
System.out.println("The last letter of " + firstWord + "is " + lastLetterFirstWord);
fullWord = firstWord + secondWord + thirdWord + fourthWord;
fullWordCharacters = fullWord.length();
System.out.println(firstWord +", " + secondWord + ", " + thirdWord + ", " + fourthWord + "has length of" + fullWordCharacters);
I'm trying to get the user to enter 4 words seperated by an "*" for example She*will*call*back and I want an output like like this
She has length 3
will has length 4
call has length 4
back has length 4
The * symbols were found at positions: 3, 8, and 13
The last character of she is s
The length of She, will, call, and back is 15
But I keep getting this java.lang.StringIndexOutOfBoundsException error. How do I fix this?
This line crashes the program
secondWord = fullWord.substring(firstPositionOfAsterisk + 1, secondPositionOfAsterisk);
Simple.. read this.. String.substring(int, int)
And you'll see that
throws
IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.
the important part is or beginIndex is larger than endIndex
probably your secondPositionOfAsterisk is getting a negative (-1) value
firstWord = fullWord.substring(0, firstPositionOfAsterisk);
The above takes the first part of the string up to the first asterisk, thus it won't contain an asterisk. So this will return -1:
secondPositionOfAsterisk = firstWord.indexOf("*");
Then this will fail: (because -1 is not a valid index)
secondWord = fullWord.substring(firstPositionOfAsterisk + 1, secondPositionOfAsterisk);
I think this:
secondPositionOfAsterisk = firstWord.indexOf("*");
should be
int offset = firstWord.length()+1;
secondPositionOfAsterisk = firstWord.indexOf("*", offset);
or something like that.
Personally I think String#split is a way better option.