I want to know how can i read the contents of a file, character by character?
I tried this code
Scanner sc = new Scanner(new BufferedReader(newFileReader("C:\\saml.txt")));
while(sc.hasNext())
{
String s=sc.next();
char x[]=s.toCharArray();
for(int i=0;i<x.length;i++)
{
if(x[i]=='\n')
System.out.println("hello");
System.out.println(x[i];
}
I want to give input in file as:
"pure
world
it
is"
I want the output
"pure
hello
world
hello
it
hello
is
hello"
Two options:
Compare the string read against System#lineSeparator. If you use Java 6 or prior, use System.getProperty("line.separator");:
String s = sc.next();
if (System.lineSeparator().equals(s)) {
//...
}
Use Scanner#nextLine that will return a String until it finds a line separator character(s) (it will consume the line separator character(s) for you and remove it), then split the string by empty spaces and work with every string between spaces.
String s = sc.nextLine();
String[] words = s.split("\\s+");
for (String word : words) {
//...
}
Note that in any of these cases you don't need to evaluate each character in the String.
I would suggest using Scanner.nextLine and either using String.join(java 8+) or going for the manual method:
Without a trailing "hello":
while (sc.hasNext()){
String[] words = sc.nextLine().split(" ");
String sentence = words[0];
for(int i = 0; ++i < words.length;)
sentence += " hello " + words[i];
System.out.println(sentence);
}
With a trailing "hello":
while (sc.hasNext()){
for(String w : sc.nextLine().split(System.getProperty("line.separator")))
System.out.print(w + " hello ");
System.out.println();
}
Related
Thanks for checking out my question.
Here the user enter the string in the format: "xD xS xP xH". The program takes the string, splits it on the space bar, then uses regex to parse the string. There is an issue with my "final string regex" and I am not sure where.
final String regex = "([0-9]+)[D|d]| ([0-9]+)[S|s]| ([0-9]+)[P|p]| ([0-9]+)[H|h]";
Lastly, the loop prints out only the value for D so I suspect it reaches an error moving to match S or s.
public class parseStack
{
public parseStack()
{
System.out.print('\u000c');
String CurrencyFormat = "xD xS xP xH";
System.out.println("Please enter currency in the following format: \""+CurrencyFormat+"\" where x is any integer");
Scanner scan = new Scanner(System.in);
String currencyIn = scan.nextLine();
currencyFinal = currencyIn.toUpperCase();
System.out.println("This is the currency you entered: "+currencyFinal);
String[] tokens = currencyFinal.split(" ");
final String input = tokens[0];
final String regex = "([0-9]+)[D|d]| ([0-9]+)[S|s]| ([0-9]+)[P|p]| ([0-9]+)[H|h]";
if (input.matches(regex) == false) {
throw new IllegalArgumentException("Input is malformed.");
}
long[] values = Arrays.stream(input.replaceAll(regex, "$1 $2 $3 $4").split(" "))
.mapToLong(Long::parseLong)
.toArray();
for (int i=0; i<values.length; i++)
{
System.out.println("value of i: "+i+ " |" +values[i]+ "|");
}
//pause to print
System.out.println("Please press enter to continue . . . ");
Scanner itScan = new Scanner(System.in);
String nextIt = itScan.nextLine();
}
}
Your regular expression should be [\d]+[DdSsPpHh].
The problem you are having is you split the string into chunks, then you match chunks with a RegEx that matches the original string that you have split.
HOWEVER this answer only addresses a problem in your code. Your routine doesn't seem to cater your expectation. And your expectation is not clear at all.
EDIT
Added the multidigit requirement.
Your regex can be simplified somewhat.
"(?i)(\d+d) (\d+s) (\d+p) (\d+h)"
will do a case-insensitive match against multiple digits ( \d+ )
This can be further simplified into
"(?i)(\d+[dsph])"
which will iteratively match the various groups in your currency string.
First of all your regex looks a bit to complex. You input format is "xD xS xP xH" also you are converting the input to uppercase currencyIn = currencyIn.toUpperCase(); but this isn't the problem.
The problem is
String[] tokens = currencyIn.split(" ");
final String input = tokens[0];
You are splitting the input and only use the first part which would be "xD"
The fixed code would look like:
String currencyIn = scan.nextLine();
currencyIn = currencyIn.toUpperCase();
System.out.println("This is the currency you entered: "+currencyIn);
final String regex = "([0-9]+)D ([0-9]+)S ([0-9]+)P ([0-9]+)H";
if (!currencyIn.matches(regex)) {
throw new IllegalArgumentException("Input is malformed.");
}
long[] values = Arrays.stream(currencyIn.replaceAll(regex, "$1 $2 $3 $4").split(" "))
.mapToLong(Long::parseLong)
.toArray();
for (int i=0; i<values.length; i++) {
System.out.println("value of i: "+i+ " |" +values[i]+ "|");
}
I am attempting to write a program that reverses a string's order, even the punctuation. But when my backwards string prints. The punctuation mark at the end of the last word stays at the end of the word instead of being treated as an individual character.
How can I split the end punctuation mark from the last word so I can move it around?
For example:
When I type in : Hello my name is jason!
I want: !jason is name my Hello
instead I get: jason! is name my Hello
import java.util.*;
class Ideone
{
public static void main(String[] args) {
Scanner userInput = new Scanner(System.in);
System.out.print("Enter a sentence: ");
String input = userInput.nextLine();
String[] sentence= input.split(" ");
String backwards = "";
for (int i = sentence.length - 1; i >= 0; i--) {
backwards += sentence[i] + " ";
}
System.out.print(input + "\n");
System.out.print(backwards);
}
}
Manually rearranging Strings tends to become complicated in no time. It's usually better (if possible) to code what you want to do, not how you want to do it.
String input = "Hello my name is jason! Nice to meet you. What's your name?";
// this is *what* you want to do, part 1:
// split the input at each ' ', '.', '?' and '!', keep delimiter tokens
StringTokenizer st = new StringTokenizer(input, " .?!", true);
StringBuilder sb = new StringBuilder();
while(st.hasMoreTokens()) {
String token = st.nextToken();
// *what* you want to do, part 2:
// add each token to the start of the string
sb.insert(0, token);
}
String backwards = sb.toString();
System.out.print(input + "\n");
System.out.print(backwards);
Output:
Hello my name is jason! Nice to meet you. What's your name?
?name your What's .you meet to Nice !jason is name my Hello
This will be a lot easier to understand for the next person working on that piece of code, or your future self.
This assumes that you want to move every punctuation char. If you only want the one at the end of the input string, you'd have to cut it off the input, do the reordering, and finally place it at the start of the string:
String punctuation = "";
String input = "Hello my name is jason! Nice to meet you. What's your name?";
System.out.print(input + "\n");
if(input.substring(input.length() -1).matches("[.!?]")) {
punctuation = input.substring(input.length() -1);
input = input.substring(0, input.length() -1);
}
StringTokenizer st = new StringTokenizer(input, " ", true);
StringBuilder sb = new StringBuilder();
while(st.hasMoreTokens()) {
sb.insert(0, st.nextToken());
}
sb.insert(0, punctuation);
System.out.print(sb);
Output:
Hello my name is jason! Nice to meet you. What's your name?
?name your What's you. meet to Nice jason! is name my Hello
Like the other answers, need to separate out the punctuation first, and then reorder the words and finally place the punctuation at the beginning.
You could take advantage of String.join() and Collections.reverse(), String.endsWith() for a simpler answer...
String input = "Hello my name is jason!";
String punctuation = "";
if (input.endsWith("?") || input.endsWith("!")) {
punctuation = input.substring(input.length() - 1, input.length());
input = input.substring(0, input.length() - 1);
}
List<String> words = Arrays.asList(input.split(" "));
Collections.reverse(words);
String reordered = punctuation + String.join(" ", words);
System.out.println(reordered);
The below code should work for you
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceSample {
public static void main(String[] args) {
String originalString = "TestStr?";
String updatedString = "";
String regex = "end\\p{Punct}+|\\p{Punct}+$";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(originalString);
while (matcher.find()) {
int start = matcher.start();
updatedString = matcher.group() + originalString.substring(0, start);<br>
}
System.out.println("Original -->" + originalString + "\nReplaced -->" + updatedString);
}
}
You need to follow the below steps:
(1) Check for the ! character in the input
(2) If input contains ! then prefix it to the empty output string variable
(3) If input does not contain ! then create empty output string variable
(4) Split the input string and iterate in reverse order (you are already doing this)
You can refer the below code:
public static void main(String[] args) {
Scanner userInput = new Scanner(System.in);
System.out.print("Enter a sentence: ");
String originalInput = userInput.nextLine();
String backwards = "";
String input = originalInput;
//Define your punctuation chars into an array
char[] punctuationChars = {'!', '?' , '.'};
String backwards = "";
//Remove ! from the input
for(int i=0;i<punctuationChars.length;i++) {
if(input.charAt(input.length()-1) == punctuationChars[i]) {
input = input.substring(0, input.length()-1);
backwards = punctuationChars[i]+"";
break;
}
}
String[] sentence= input.split(" ");
for (int i = sentence.length - 1; i >= 0; i--) {
backwards += sentence[i] + " ";
}
System.out.print(originalInput + "\n");
System.out.print(input + "\n");
System.out.print(backwards);
}
Don't split by spaces; split by word boundaries. Then you don't need to care about punctuation or even putting spaces back, because you just reverse them too!
And it's only 1 line:
Arrays.stream(input.split("\\b"))
.reduce((a, b) -> b + a)
.ifPresent(System.out::println);
See live demo.
I want to prepend "\n" to the last word of the string
for example
Hello friends 123
Here i want to add "\n" just before the word "123"
I tried below code but having no idea what to do now
String sentence = "I am Mahesh 123"
String[] parts = sentence.split(" ");
String lastWord = "\n" + parts[parts.length - 1];
Try this
String sentence = "Hello friends 123456";
String[] parts = sentence.split(" ");
parts[parts.length - 1] = "\n" + parts[parts.length - 1];
StringBuilder builder = new StringBuilder();
for (String part : parts) {
builder.append(part);
builder.append(" ");
}
System.out.println(builder.toString());
Output will be :~
Hello friends
123456
Try the below code...it will work
parts[parts.length]=parts[parts.length-1];
parts[parts.length-1]="\n";
Please try this.
String sentence = "I am Mahesh 123";
String[] parts = sentence.split(" ");
String string="";
for (int i =0;i<parts.length;i++)
{
if (i==parts.length-1)
{
string = string+"\n"+parts[i];
}
else
string = string+" "+parts[i];
}
Toast.makeText(Help.this, string, Toast.LENGTH_SHORT).show();
You want to add a break/new line at the end of your string.
You can find the space via lastIndexOf(), this will give you the int of where the space is located in the String sentence.
You can use this small example here:
public class Main {
public static void main(String[] args) {
String sentence = "I am Mahesh 123";
int locationOfLastSpace = sentence.lastIndexOf(' ');
String result = sentence.substring(0, locationOfLastSpace) //before the last word
+ "\n"
+ sentence.substring(locationOfLastSpace).trim(); //the last word, trim just removes the spaces
System.out.println(result);
}
}
Note that StringBuilder is not used because since Java 1.6 the compiler will create s StringBuilder for you
I am having trouble understanding how to NOT count control characters in a text file. My program does everything but skip control characters \n \r:
contents of file: Ok upon further tries I am closer. If I change:
while (input.hasNext()) {
String line = input.nextLine();
lineCount++;
wordCount += countWords(line);
charcount += line.length();
to
while (input.hasNext()) {
String line = input.next();
lineCount++;
wordCount += countWords(line);
charCount += line.replace("\n", "").replace("\r", "").length();
the chars are counted but it messes up the lines. If I add the input.nextLine it messes up the chars.
contents of text file:
cat
sad dog
dog wag
import java.io.*;
import java.util.*;
public class Character_count {
public static void main(String args[]) throws Exception {
java.io.File file = new java.io.File("textFile.txt");
// Create a Scanner for the file
Scanner input = new Scanner(file);
int charcount = 0;
int wordCount = 0;
int lineCount = 0;
while (input.hasNext()) {
String line = input.nextLine();
lineCount++;
wordCount += countWords(line);
charcount += line.length();
}
System.out.println("The file " + file + " has ");
System.out.println(charcount + " characters");
System.out.println(wordCount + " words");
System.out.println(lineCount + " lines");
}
private static int countWords(String s) {
Scanner input = new Scanner(s);
int count = 0;
while (input.hasNext()) {
input.next();
count++;
}
return count;
}
}
You could replace all the \n and \r with empty String like this:
line = line.replaceAll("\\r?\\n", "")
Now you can do the counts and it would not take into account any \n or \r.
You could alternatively do (Without using regex):
line = line.replace("\n", "").replace("\r", "")
You can achieve that with your Scanner by using the useDelimiter method:
Scanner input = new Scanner(new File("textFile.txt"));
input.useDelimiter("\r\n");
And continue with your code as usual, should work.
Also (and very important) if you check hasNext() then use next(), and if you check hasNextLine() use nextLine()! Don't mix-and-match as it will cause (or already causing) issues down the line.
Hello you should use '\s' in the regular expression that represents white spaces
\s stands for "whitespace character". Again, which characters this actually includes, depends on the regex flavor. In all flavors discussed in this tutorial, it includes [ \t\r\n\f]. That is: \s matches a space, a tab, a line break, or a form feed.(http://www.regular-expressions.info/shorthand.html)
so here how you use it
Scanner scanner = new Scanner(path.toFile(),"UTF-8");
String content = scanner.useDelimiter("\\A").next();
System.out.println(content);
Pattern patternLine = Pattern.compile("\\r?\\n");
Matcher matcherLine = patternLine.matcher(content);
int numberLines = 1;
while (matcherLine.find())
numberLines++;
Pattern pattern = Pattern.compile("\\s");
Matcher matcherEliminateWhiteSpace = pattern.matcher(content);
String contentWithoutWhiteSpace=matcherEliminateWhiteSpace.replaceAll("");
// it will count only ASCII Charachter a->z A->Z 0->9 _'underscore'
Pattern patternCharachter=Pattern.compile("\\w");
Matcher matcherCharachterAscii= patternCharachter.matcher(contentWithoutWhiteSpace);
int numberCharachtersAscii = 0;
while (matcherCharachterAscii.find())
numberCharachtersAscii++;
//it will count UTF-8 charachters it will count all charachter no matter what script it is like français عربي and punctuation
Pattern patternUniversal= Pattern.compile(".");
Matcher matcherUniversal= patternUniversal.matcher(contentWithoutWhiteSpace);
int numberUniversalCharachter=0;
while(matcherUniversal.find())
numberUniversalCharachter++;
System.out
.println("******************************************************");
System.out.println(contentWithoutWhiteSpace);
System.out.println(numberLines);
System.out.println(numberCharachtersAscii);
System.out.println(numberUniversalCharachter);
EDIT
here is a simple modification that will make it work
while (scanner.hasNext()) {
String line = scanner.nextLine();
lineCount++;
wordCount += countWords(line);
charcount += word.replaceAll("\\s", "").length();
System.out.println(charcount);
i++;
}
\\s stands for white spaces[tab cariagReturn lineFeed space formFeed ]
So I have a scanner that takes in a string and saves it to input then I try to do
input.replaceAll("?/.,!' ", "");
and print the line below to test it but it just doesn't replace anything
import java.util.Scanner;
public class Test2 {
public static void main (String[]args){
Scanner sc = new Scanner (System.in);
System.out.print("Please enter a sentence: ");
String str = sc.nextLine();
int x, strCount = 0;
String str1;
str1 = str.replaceAll(",.?!' ", "");
System.out.println(str1);
for (x = 0; x < str1.length(); x++)
{
strCount++;
}
System.out.println("Character Count is: " + strCount);
}
}
Here is the code I am working with. all I need is to replace all punctuation and spaces with nothing.
This line :
str.replaceAll(",.?!' ", "");
will search the entire string ",.?!' " to be replaced.
The argument of the replaceAll method is a regex.
So, it will surely be better with something like that :
str.replaceAll("[,.?!' ]", "");
The first parameter must be a regular expression, here alternative character classes [ ... ].
String str1 = str.replaceAll("[?/.,!' ]", "");
or more generalized s=whitespace, Punct=punctuation:
String str1 = str.replaceAll("[\\s\\p{Punct}]", "");
replaceAll takes a regular expression as the first argument, so it needs to be formatted as such:
str1 = str.replaceAll("[,.?!' ]", "");
More information: http://www.regular-expressions.info/tutorial.html
Unless the characters ,.?! appear together in the input String no replacement will be made. You could use a character class to specify a range of characters
str1 = str.replaceAll("[,.?!' ]", "");