In: Computer Science
In java, follow the methods in bold
First, launch NetBeans and close any previous projects that may be open (at the top menu go to File ==> Close All Projects).
Then create a new Java application called "WeightedAvgDataAnalyzer" (without the quotation marks), that modifies the DataAnalyzer.java in Horstmann Section 7.5, pp. 350-351 according to the specifications below.
The input file should be called 'data.txt' and should be created according to the highlighted instructions below. Note that even though you know the name of the input file, you should not hard-code this name into your program. Instead, prompt the user for the name of the input file.
The input file should contain (in order): the weight (a number greater than zero and less than or equal to 1), the number, n, of lowest numbers to drop, and the numbers to be averaged after dropping the lowest n values.
You should also prompt the user for the name of the output file, and then print your results to an output file with the name that the user specified.
You can use a writeFile method that does all the work (i.e., does not call a writeData method the way that Horstmann’s readFile method calls a readData method). Use a try-with-resources statement in your writeFile method when creating a new PrintWriter.
The inputValues come from a single line in a text file
(data.txt) such as the following:
0.5 3 10 70 90 80 20
The output in the output file must give the weighted average, the data and weight that were used to calculate the weighted average, and the number of values dropped before the weighted average was calculated.
Your output should look very much like the following: "The weighted average of the numbers is 42.5, when using the data 10.0, 70.0, 90.0, 80.0, 20.0, where 0.5 is the weight used, and the average is computed after dropping the lowest 3 values."
Write the output to a file with the filename that the user chose to name the output file (e.g., output.txt). Don't hard-code the output file name in your program.
WeightedAvgDataAnalyzer PA
This assignment builds off of an example in Horstmann (called DataAnalyzer) which supplies you with
some code for giving the user multiple opportunities for entering a correct file name, and the previous
PA WeightedAvgDropSmallest. This PA should use ArrayLists.
Create an input file called ‘data.txt’ (see directions at the bottom of the PA description).
Even though you create a specific input file with a name, prompt the user for a filename. The file should
contain a weight value (type double, between 0 and 1); the number of lowest values to drop, and the
numbers to be averaged (after dropping the lowest values).
Contents of an input file called data.txt might look something like:
0.5 3 10 70 90 80 20
In main use a while loop like the one used in the Horstman example which allows the user to re-enter
the input file name (this allows for testing exceptions). Below, I have used the Horstmann loop
structure. Modify the code to use ArrayLists instead of arrays. Instead of computing the sum in the
Horstmann example, do a call to a method which is very similar to the one in the
WeightedAvgDropSmallest PA. Also, prompt the user for an output file name. And, call another method
to write the contents of the output file.
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
boolean done = false;
while (!done) {
try {
System.out.print("Enter the input file name: ");
String infileName = in.next();
// Declare an ArrayList of type double on left side of
// assignment statement for readFile(infileName) call.
// readFile will fill the ArrayList with values from the input file.
// for example:
ArrayList<Double> data = readFile(infileName);
// Call a method to calculate the weighted average and return it as type double
// to main, similar to code in WeightedAvgDropSmallest
// for example:
double weightedAvg = calcWeightedAvg(data);
// Print out the weighted average.
// Prompt user for an output file name and read it into a String variable.
// Call a method to write the file, pass three parameters:
// the file name, the ArrayList containing the values, the weighted average.
// for example:
WriteFile(outfileName, data, weightedAvg);
// The contents of the output file should look like (see below, out.txt)
done = true;
// example catches
} catch (FileNotFoundException exception) {
System.out.println("File not found");
} catch (IOException exception) {
exception.printStackTrace();
}
}
}
Example contents of output file called out.txt (this can be all in one line):
The weighted average of the numbers is 42.5, when using the data 10.0,70.0,90.0,80.0,20.0,
where 0.5 is the weight used, and the average is computed after dropping the lowest 3 values.
6
Here’s the example run using the input file above called data.txt and output file called out.txt
run:
Enter the input file name: data.txt
weighted average = 42.5
Enter the output file name: out.txt
Writing to file
BUILD SUCCESSFUL (total time: 27 seconds)
The other methods:
You will be able to reuse some of the code in the Horstmann readFile method but in this case the
method needs to return an ArrayList of type Double. The input file name is passed in as a parameter
For example the method header might look like below:
public static ArrayList<Double> readFile(String filename) throws IOException
Not too much can be reused from the Horstmann readData method. Instead, the method needs to
return an ArrayList of type Double. Use a while loop with a condition hasNextDouble() to keep checking
for the last value in the input file. Inside the while loop is your call to nextDouble() – we have used this
before. Notice in the header, the Scanner object declared in readFile method is passed in as a parameter
(same as in Horstmann).
public static ArrayList<Double> readData(Scanner in) throws IOException
Example header for the method that actually calculates the weighted average. The filled ArrayList (with
values from the input file) is passed as a parameter. The method returns the weighted average to main:
public static double calcWeightedAvg(ArrayList<Double> data)
Here’s an example method header that writes to the output file. Notice the three parameters. There are
different approaches, I used the PrintWriter class and declared a new PrintWriter within the ‘try’
condition (see below):
public static void WriteFile(String outfile, ArrayList<Double> data, double weightedAvg) throws
FileNotFoundException {
try (PrintWriter outs = new PrintWriter(new FileOutputStream(outfile))) {
outs.printf("The weighted . . . .
// for loop that reads the elements in the ArrayList called data
/******************************DataAnalyzer.java********************************/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class DataAnalyzer {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
boolean done = false;
while (!done) {
try {
System.out.print("Enter the input file name: ");
String infileName = in.next();
// Declare an ArrayList of type double on left side of
// assignment statement for readFile(infileName) call.
// readFile will fill the ArrayList with values from the input file.
// for example:
ArrayList<Double> data = readFile(infileName);
// Call a method to calculate the weighted average and return it as type double
// to main, similar to code in WeightedAvgDropSmallest
// for example:
double weightedAvg = calcWeightedAvg(data);
// Print out the weighted average.
// Prompt user for an output file name and read it into a String variable.
System.out.print("Enter output file name:
");
String outfileName = in.next();
// Call a method to write the file, pass three parameters:
// the file name, the ArrayList containing the values, the weighted average.
// for example:
writeFile(outfileName, data, weightedAvg);
// The contents of the output file should look like (see below, out.txt)
done = true;
// example catches
} catch (FileNotFoundException exception) {
System.out.println("File not found");
} catch (IOException exception) {
exception.printStackTrace();
}
}
}
//method readFile()
public static ArrayList<Double> readFile(String
filename) throws IOException {
ArrayList<Double> data = new ArrayList<>();
File file = new
File(filename);
Scanner sc = new
Scanner(file);
// while loop till file has
line
while (sc.hasNextDouble()) {
// read the
line
double value =
sc.nextDouble();
data.add(value);
}
sc.close();
return data;
}
//method calcWeightedAvg()
public static double
calcWeightedAvg(ArrayList<Double> data) {
double weightedAvg, total =
0;
double weight =
data.remove(0);
data.trimToSize();
double droppedValues =
data.remove(0);
data.trimToSize();
Collections.sort(data);
Collections.reverse(data);
for (int i = 0; i < droppedValues; i++) {
data.remove(data.size() - 1);
data.trimToSize();
}
for (Double double1 : data) {
total +=
double1 * (weight);
}
weightedAvg = total /
data.size();
return weightedAvg;
}
//method writeFile()
public static void writeFile(String outfile,
ArrayList<Double> data, double weightedAvg) throws
FileNotFoundException {
try (PrintWriter outs = new PrintWriter(new FileOutputStream(outfile))) {
outs.printf("The weighted average is: %s", weightedAvg);
}
}
}
/*************************output*****************************/
Please let me know if you have any doubt or modify the answer, Thanks :)