Read file into array returns wrong elements - java

I'm attempting to take an input from the user, then if it matches one of the existing files, read the file and put the words, letters, or number into an array. The "words", and "alphabet" files seem to work fine, but the "numbers" is giving me an issue. It finds the file, reads it, puts it into an array, and gives the summation of the numbers; however, the output of the array is every other number, as opposed to all numbers, like it should be doing.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class fileIO
{
public static void main (String[] args) throws FileNotFoundException
{
String filename;
System.out.println("Please enter name of file (alphabet,words,numbers): ");
Scanner input = new Scanner(System.in);
filename = input.nextLine();
if(filename.equals("numbers"))
{
int sum = 0;
Scanner reader = new Scanner(new File("/home/ninjew/workspace/FileIO/src/" + filename + ".txt"));
ArrayList<Integer> arr = new ArrayList<Integer>();
while(reader.hasNext())
{
arr.add(reader.nextInt());
sum = sum + reader.nextInt();
}
System.out.println(arr);
System.out.println("The summation is: " + sum);
reader.close();
}
else if(filename.equals("words") || filename.equals("alphabet"))
{
Scanner reader = new Scanner(new File("/home/ninjew/workspace/FileIO/src/" + filename + ".txt"));
// This is for words and letters within the file. Print words and letters.
ArrayList<String> arr = new ArrayList<String>();
while(reader.hasNext())
{
String line = reader.next();
Scanner scanner = new Scanner(line);
scanner.useDelimiter(",");
while(scanner.hasNext()){
arr.add(scanner.next());
}
scanner.close();
}
System.out.println(arr);
reader.close();
}
}
}

In if(filename.equals("numbers")) you are doing two reads from your file in this block, which is why it is skipping numbers
while(reader.hasNext())
{
arr.add(reader.nextInt());
sum = sum + reader.nextInt();
}
Should be
while(reader.hasNext())
{
int val = reader.nextInt();
arr.add(val);
sum = sum + val;
}

Your numbers reader loop is adding first number to the array and the next number to the sum.
If input is 1 2 3 4 5 6, your array is [1, 3, 5] and your sum is 2 + 4 + 6 = 12.

You are reading next two integers in one go. Every time you call scanner.nextInt() it will read a next int. You need to store nextInt in a temp variable and use it in both the places.
while(reader.hasNext())
{
int next = reader.nextInt();
arr.add(next);
sum = sum + next;
}

Related

Going through a txt file and finding sum of integers with exception

I have program that is suppose to ask the user what txt file, go through the txt file and find all parsable ints and average them. I have the following code below, but it's giving me a bunch of errors. What is the cause of all these errors?
The txt file is:
5
15
312
16
eight seven 44
eighty-five thousand and sixty-two 13 98
93
import java.util.Scanner;
public class Ch12Pt2 {
public static void main(String[] args) throws NumberFormatException {
Scanner input = new Scanner(System.in);
System.out.print("Enter filename: ");
String filename = input.nextLine();
Scanner file = new Scanner(filename);
if(file.nextLine().equals(""))
{
System.err.println("Could not find file:" + filename);
System.exit(1);
}
do {
try {
int total = 0;
int count = 0;
int num = file.nextInt();
total = num + total;
//Display the results
System.out.println("The number of parsable numbers: " + count);
System.out.println("Average values: " + (total / count));
}
catch (NumberFormatException ex) {
System.out.println("Cannot parse " + num + " as an integer.");
file.nextInt();
}
} while (file.hasNextInt());
// Close the files
input.close();
file.close();
}
}
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Ch12Pt2.main(Ch12Pt2.java:21)
If you look at the JavaDoc for the constructor you used, you will that it "Constructs a new Scanner that produces values scanned from the specified string." What you want is Scanner#Scanner(File source), "...a new Scanner that produces values scanned from the specified file".
Do not use do-while, it will through a null pointer if your file does not have any integers. Use while instead. Also, do not initialize any of your variables inside the loop. This will cause them to re-initialize at ever iteration.
What is the point of file.nextInt(); in your catch block? It causes the program to skip an extra integer. Remove it. Furthermore, do not call input.close();, you do not want to close System.in.
#SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.println("Enter filename: ");
File file = new File(input.nextLine());
/*
* Check file existence before constructing your scanner. This will prevent a
* FileNotFoundException. Notice, I used File#exists and the NOT operator '!'
*/
if (!file.exists()) {
System.err.println("Could not find file: " + file.getName());
System.exit(0);
}
Scanner scanner = new Scanner(file);
// Initialize variables outside of loop.
int num = 0;
int total = 0;
int count = 1;
// No do-while
while (scanner.hasNextInt()) {
try {
num = scanner.nextInt();
total += num;
// Display the results
System.out.println("The number of parsable numbers: " + count);
System.out.println("Average values: " + (total / count));
// count is pointless unless you increase it after every number.
count++;
} catch (NumberFormatException ex) {
System.out.println("Cannot parse " + num + " as an integer.");
}
}
// Close the files
scanner.close();
Finally, as Mad Programmer pointed out, "eight seven" and "eighty-five thousand and sixty-two" are not numbers, thus Scanner#nextInt will not include them. A work around is to use Scanner#nextLine and parse accordingly. Something like this: How to convert words to a number?
Your code is all most all wrong. I have reworked it now it works.
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class Ch12Pt2 {
public static void main(String[] args) throws NumberFormatException, FileNotFoundException {
Scanner input = new Scanner(System.in);
System.out.print("Enter filename: ");
String filename = input.nextLine();
Scanner file = new Scanner(new FileReader(filename));
int num =0;
int count =0;
int total =0;
if(file.nextLine().equals(""))
{
System.err.println("Could not find file:" + filename);
System.exit(1);
}
while (file.hasNextInt()){
try {
num = file.nextInt();
total = num + total;
count++;
}
catch (NumberFormatException ex) {
System.out.println("Cannot parse " + num + " as an integer.");
}
}
// Close the files
input.close();
file.close();
System.out.println("The number of parsable numbers: " + count);
System.out.println("Average values: " + (total / count));
}
}
Scanner file = new Scanner(filename);
Exception in thread "main" java.util.NoSuchElementException
If you're reading data from a text file using a Scanner you need to specify a File, not a string, which is why you're getting the above error.
Use:
Scanner scanner = new Scanner(new FileReader("foo.txt"));
And then recursively go through the text file like this:
while(scanner.hasNext())
Your code:
while (file.hasNextInt());
Will not work because the hasNextInt() method will stop processing the text file when it encounters anything other than an integer.
System.out.println("Cannot parse " + num + " as an integer.");
Variable num is defined in a different scope to the body that handles the exception. An additional error will be thrown because num is not defined within the NumberFormatException body.
The txt file is: 5 15 312 16 eight seven 44 eighty-five thousand and sixty-two 13 98 93
If the items in the text file are on the same line it would be better to use the split method to get all elements and then detect whether they're numbers or not.
String line = sc.nextLine();
String elements = line.split(" ");
for (String e : elements) {
// add if int, or continue iteration
}
Otherwise, try something along the lines of:
int sum = 0;
int numElements = 0;
Scanner scanner = new Scanner(new FileReader("path-to-file"));
while (scanner.hasNext()) {
try {
int temp = Integer.parseInt(sc.nextLine());
sum += temp;
numElements += 1;
}catch(NumberFormatException e) {
continue;
}
}
System.out.println("Mean: "+ (sum/numElements));

Counting Numbers and words in a Text file Program

I need to do a simple program that counts the number of words and gives the total of the numbers in a text file. The program has to compute the sum and average of all the numbers. The average is the sum divided by the count.The file counts the numbers and words together. It just prints 34.
//CAT DOG BIRD FISH
//1 2 3 4 5
//TURTLE LIZARD SNAKE
//6 7 8 9 10
//FISH SHARK
//11 12 13 14 15
//SPIDER FLY GRASSHOPPER ANT SCORPION
//16 17 18 19 20
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class HomeWork8 {
public static void main(String[] args) throws IOException {
String words, numbers, message;
int numberWords = 0, countNumber = 0;
FileInputStream fis = new FileInputStream("/Users/ME/Documents/Words and Numbers.txt");
Scanner in = new Scanner(fis);
while (in.hasNext()) {
words = in.next();
numberWords++;
}
while (in.hasNext()) {
in.useDelimiter("");
numbers = in.next();
countNumber++;
}
in.close();
message = "The number of words read from the file was " + numberWords
+ "\nThe count of numbers read from the file was" + countNumber;
JOptionPane.showMessageDialog(null, message);
}
}
String pattern ="\\d";
String word="shdhdshk 46788 jikdjsk 9 dsd s90 dsds76";
Matcher m = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE).matcher(word);
int count=0;
while (m.find()) {
count++;
}
System.out.println(count);
If you need to get the single number character count you can use \d . But If you are interested in whole number occurrence then you have to use \d+ instead of \d. Ex: 46788,9,90,76
You can even use regular expressions to filter the words and numbers as is shown below:
public static void main(String[] args) throws IOException {
String words, message;
int numberWords = 0, countNumber = 0;
FileInputStream fis = new FileInputStream("src/WordsandNumbers.txt");
Scanner in = new Scanner(fis);
String numRegex = ".*[0-9].*";
String alphaRegex = ".*[A-Za-z].*";
while (in.hasNext()) {
words=in.next();
if (words.matches(alphaRegex)) {
numberWords++;
}
else if(words.matches(numRegex))
{
countNumber++;
}
}
in.close();
message = "The number of words read from the file was " + numberWords
+ "\nThe count of numbers read from the file was" + countNumber;
System.console().writer().println(message);
}
You need to have a single iteration through the content of the filerather than having 2 while loops.
Just before the second while (in.hasNext()) { you should reset the stream by adding the following code:
in = new Scanner(fis);
You should also revise your code for checking for numbers (I don't think you're checking for numbers anywhere).

Scan all integers on a line into an ArrayList

I am trying to scan a line of Integers from a txt file and store them within an ArrayList. My question is simple, how can I do this?
This is what I have
public static void main(String[] args) throws FileNotFoundException {
ArrayList<Integer> coinTypes = new ArrayList<Integer>();
Integer i ;
File f = new File (args[0]);
Scanner input = new Scanner(f);
i = input.nextInt() ;
input.nextLine();
while(input.hasNextInt()) {
if(input.hasNextLine()) {
coinTypes.add(i);
}
if(input.hasNextLine()) {
change = input.nextInt();
System.out.println("Found change"); //used for debugging
System.out.println("Change: " + change);
}
}
System.out.println(coinTypes);
}
}
Why doesn't what I have work?
INPUT:
java homework5 hwk5sample1.txt
OUTPUT:
Found change
Change: 143
[1]
Txt file:
// Coins available in the USA, given in cents. Change for $1.43?
1 5 10 25 50 100
143
WANT:
Change: 143
[1, 5, 10, 25, 50, 100]
There are different problems in your code
if(input.hasNextLine()) {
coinTypes.add(i);
}
That if is not required since you are checking that in the while before
The main problem is that you are not reading the input inside the loop ie
i = input.nextInt() ;
This should be inside the while loop.
And finally your change should not be put in that loop as change is a single value. If you keep it the loop change will be read every time the loop iterates. But if you keep it outside the loop another problem arise. ie the change will also be read after reading the coins to coinTypes.
Solution
input.nextLine();
while (input.hasNextInt()) {
i = input.nextInt();
coinTypes.add(i);
}
int change = coinTypes.get(coinTypes.size()-1);
coinTypes.remove(coinTypes.size() - 1);
System.out.println("Change: " + change);
System.out.println(coinTypes);
After the loop coinTypes will have the change as the last item. I have removed that last item and kept the last item in change using these lines.
int change = coinTypes.get(coinTypes.size()-1);
coinTypes.remove(coinTypes.size() - 1);
Alternate Solution
ArrayList<Integer> coinTypes = new ArrayList<Integer>();
Integer i;
File f = new File(args[0]);
Scanner input = new Scanner(f);
input.nextLine();
int change;
String[] coinsline = input.nextLine().split("\\s");
for(String coin: coinsline) {
coinTypes.add(Integer.parseInt(coin));
}
change = Integer.parseInt(input.nextLine());
System.out.println("change: " + change);
System.out.println(coinTypes);
I would open the file, read the first line and split it.
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
String[] numbers_= br.readLine().split(" ");
int[] numbers = new int[numbers_.length]; //I don't remember if this could be done.
for(int i = 0; i < numbers.length; i++) {
numbers[i] = Integer.parseInt( numbers_[i] );
}
}
finally {
br.close();
}
I think something like that should work =)

summing in separate using break java scanner

I have data in txt :
1
2
3
4
5
6
7
8
if I want to sum in separate ex : 1+2+3 result is 6 and 4+5+6...n= 30
Separated list means the list of numbers separated with empty line. For example in above example, numbers 1 2 3 and 4 5 6 7 8 are separated with empty line. I want the sum of first 3 numbers and then next 5 numbers separately.
Scanner sc = new Scanner (new File("patch.txt");
while (sc.hasNextLine()) {
//sum each numbers
}
How do I do it? Read data using scanner.
Scanner sc= new Scanner (new File("patch.txt"));
int sum = 0;
while (/* Condition to ensure end of file: sc.hasNextLine or similar */)
{
String str = sc.nextLine (); // Read the line
if(str.isEmpty()) { // There was no number. You may want to add more checks for example check space only string, dash string etc
// Print separated sum
System.out.println ("Sum = " + sum);
sum = 0; // reset sum
} else {
// Update sum
sum += Integer.parseInt (str);
}
}
Live example here
try
Scanner sc= new Scanner (new File("patch.txt"));
int sum = 0;
while (sc.HasNextLine ())
{
//sum each numbers
String str = sc.nextLine ();
sum += Integer.parse (str);
}
You can do as below. But If you have a empty line at the end of the file you need not have the print statement outside.
Scanner sc = new Scanner(new File("patch.txt"));
int sum=0;
while(sc.hasNextLine()){
try{
sum +=Integer.parseInt(sc.nextLine());
}
catch(Exception e){
System.out.println(sum);
sum=0;
}
}
System.out.println(sum);
sc.close();
What this does is, it loops through each line, adds to sum when it is an integer. When an exception is thrown at a empty line, the sum is initialized to zero.

How to read multiple Integer values from a single line of input in Java?

I am working on a program and I want to allow a user to enter multiple integers when prompted. I have tried to use a scanner but I found that it only stores the first integer entered by the user. For example:
Enter multiple integers: 1 3 5
The scanner will only get the first integer 1. Is it possible to get all 3 different integers from one line and be able to use them later? These integers are the positions of data in a linked list I need to manipulate based on the users input. I cannot post my source code, but I wanted to know if this is possible.
I use it all the time on hackerrank/leetcode
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String lines = br.readLine();
String[] strs = lines.trim().split("\\s+");
for (int i = 0; i < strs.length; i++) {
a[i] = Integer.parseInt(strs[i]);
}
Try this
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
if (in.hasNextInt())
System.out.println(in.nextInt());
else
in.next();
}
}
By default, Scanner uses the delimiter pattern "\p{javaWhitespace}+" which matches at least one white space as delimiter. you don't have to do anything special.
If you want to match either whitespace(1 or more) or a comma, replace the Scanner invocation with this
Scanner in = new Scanner(System.in).useDelimiter("[,\\s+]");
You want to take the numbers in as a String and then use String.split(" ") to get the 3 numbers.
String input = scanner.nextLine(); // get the entire line after the prompt
String[] numbers = input.split(" "); // split by spaces
Each index of the array will hold a String representation of the numbers which can be made to be ints by Integer.parseInt()
Scanner has a method called hasNext():
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
System.out.println(scanner.nextInt());
}
If you know how much integers you will get, then you can use nextInt() method
For example
Scanner sc = new Scanner(System.in);
int[] integers = new int[3];
for(int i = 0; i < 3; i++)
{
integers[i] = sc.nextInt();
}
Java 8
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int arr[] = Arrays.stream(in.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Here is how you would use the Scanner to process as many integers as the user would like to input and put all values into an array. However, you should only use this if you do not know how many integers the user will input. If you do know, you should simply use Scanner.nextInt() the number of times you would like to get an integer.
import java.util.Scanner; // imports class so we can use Scanner object
public class Test
{
public static void main( String[] args )
{
Scanner keyboard = new Scanner( System.in );
System.out.print("Enter numbers: ");
// This inputs the numbers and stores as one whole string value
// (e.g. if user entered 1 2 3, input = "1 2 3").
String input = keyboard.nextLine();
// This splits up the string every at every space and stores these
// values in an array called numbersStr. (e.g. if the input variable is
// "1 2 3", numbersStr would be {"1", "2", "3"} )
String[] numbersStr = input.split(" ");
// This makes an int[] array the same length as our string array
// called numbers. This is how we will store each number as an integer
// instead of a string when we have the values.
int[] numbers = new int[ numbersStr.length ];
// Starts a for loop which iterates through the whole array of the
// numbers as strings.
for ( int i = 0; i < numbersStr.length; i++ )
{
// Turns every value in the numbersStr array into an integer
// and puts it into the numbers array.
numbers[i] = Integer.parseInt( numbersStr[i] );
// OPTIONAL: Prints out each value in the numbers array.
System.out.print( numbers[i] + ", " );
}
System.out.println();
}
}
There is more than one way to do that but simple one is using String.split(" ")
this is a method of String class that separate words by a spacial character(s) like " " (space)
All we need to do is save this word in an Array of Strings.
Warning : you have to use scan.nextLine(); other ways its not going to work(Do not use scan.next();
String user_input = scan.nextLine();
String[] stringsArray = user_input.split(" ");
now we need to convert these strings to Integers. create a for loop and convert every single index of stringArray :
for (int i = 0; i < stringsArray.length; i++) {
int x = Integer.parseInt(stringsArray[i]);
// Do what you want to do with these int value here
}
Best way is converting the whole stringArray to an intArray :
int[] intArray = new int[stringsArray.length];
for (int i = 0; i < stringsArray.length; i++) {
intArray[i] = Integer.parseInt(stringsArray[i]);
}
now do any proses you want like print or sum or... on intArray
The whole code will be like this :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String user_input = scan.nextLine();
String[] stringsArray = user_input.split(" ");
int[] intArray = new int[stringsArray.length];
for (int i = 0; i < stringsArray.length; i++) {
intArray[i] = Integer.parseInt(stringsArray[i]);
}
}
}
This works fine ....
int a = nextInt();
int b = nextInt();
int c = nextInt();
Or you can read them in a loop
Using this on many coding sites:
CASE 1: WHEN NUMBER OF INTEGERS IN EACH LINE IS GIVEN
Suppose you are given 3 test cases with each line of 4 integer inputs separated by spaces 1 2 3 4, 5 6 7 8 , 1 1 2 2
int t=3,i;
int a[]=new int[4];
Scanner scanner = new Scanner(System.in);
while(t>0)
{
for(i=0; i<4; i++){
a[i]=scanner.nextInt();
System.out.println(a[i]);
}
//USE THIS ARRAY A[] OF 4 Separated Integers Values for solving your problem
t--;
}
CASE 2: WHEN NUMBER OF INTEGERS in each line is NOT GIVEN
Scanner scanner = new Scanner(System.in);
String lines=scanner.nextLine();
String[] strs = lines.trim().split("\\s+");
Note that you need to trim() first: trim().split("\\s+") - otherwise, e.g. splitting a b c will emit two empty strings first
int n=strs.length; //Calculating length gives number of integers
int a[]=new int[n];
for (int i=0; i<n; i++)
{
a[i] = Integer.parseInt(strs[i]); //Converting String_Integer to Integer
System.out.println(a[i]);
}
created this code specially for the Hacker earth exam
Scanner values = new Scanner(System.in); //initialize scanner
int[] arr = new int[6]; //initialize array
for (int i = 0; i < arr.length; i++) {
arr[i] = (values.hasNext() == true ? values.nextInt():null);
// it will read the next input value
}
/* user enter = 1 2 3 4 5
arr[1]= 1
arr[2]= 2
and soo on
*/
It's working with this code:
Scanner input = new Scanner(System.in);
System.out.println("Enter Name : ");
String name = input.next().toString();
System.out.println("Enter Phone # : ");
String phone = input.next().toString();
A simple solution can be to consider the input as an array.
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //declare number of integers you will take as input
int[] arr = new int[n]; //declare array
for(int i=0; i<arr.length; i++){
arr[i] = sc.nextInt(); //take values
}
You're probably looking for String.split(String regex). Use " " for your regex. This will give you an array of strings that you can parse individually into ints.
Better get the whole line as a string and then use StringTokenizer to get the numbers (using space as delimiter ) and then parse them as integers . This will work for n number of integers in a line .
Scanner sc = new Scanner(System.in);
List<Integer> l = new LinkedList<>(); // use linkedlist to save order of insertion
StringTokenizer st = new StringTokenizer(sc.nextLine(), " "); // whitespace is the delimiter to create tokens
while(st.hasMoreTokens()) // iterate until no more tokens
{
l.add(Integer.parseInt(st.nextToken())); // parse each token to integer and add to linkedlist
}
Using BufferedReader -
StringTokenizer st = new StringTokenizer(buf.readLine());
while(st.hasMoreTokens())
{
arr[i++] = Integer.parseInt(st.nextToken());
}
When we want to take Integer as inputs
For just 3 inputs as in your case:
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
int a,b,c;
a = scan.nextInt();
b = scan.nextInt();
c = scan.nextInt();
For more number of inputs we can use a loop:
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
int a[] = new int[n]; //where n is the number of inputs
for(int i=0;i<n;i++){
a[i] = scan.nextInt();
}
This method only requires users to enter the "return" key once after they have finished entering numbers:
It also skips special characters so that the final array will only contains integers
ArrayList<Integer> nums = new ArrayList<>();
// User input
Scanner sc = new Scanner(System.in);
String n = sc.nextLine();
if (!n.isEmpty()) {
String[] str = n.split(" ");
for (String s : str) {
try {
nums.add(Integer.valueOf(s));
} catch (NumberFormatException e) {
System.out.println(s + " cannot be converted to Integer, skipping...");
}
}
}
//Get user input as a 1 2 3 4 5 6 .... and then some of the even or odd number like as 2+4 = 6 for even number
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int evenSum = 0;
int oddSum = 0;
while (n > 0) {
int last = n % 10;
if (last % 2 == 0) {
evenSum += last;
} else {
oddSum += last;
}
n = n / 10;
}
System.out.println(evenSum + " " + oddSum);
}
}
if ur getting nzec error, try this:
try{
//your code
}
catch(Exception e){
return;
}
i know it's old discuss :) i tested below code it's worked
`String day = "";
day = sc.next();
days[i] = Integer.parseInt(day);`

Categories