SlideShare a Scribd company logo
Create a JAVA program that performs file IO and database interaction via SQL. The program
needs to read data from the provided file: "Project.csv" and insert the data into a database. Then
the program needs to create a report from the database sorted by price descending. The report
should be in the format demonstrated below.
id (primary key - generated by the database)
cpuname
performance
price
Project.csv contents:CPU NamePerformancePrice (USD)Intel Core i7-3770K @
3.50GHz9,556$560.50Intel Core i7-3770 @ 3.40GHz9,327$335.55Intel Core i7-3820 @
3.60GHz8,990$404.38AMD FX-8350 Eight-Core8,940$149.99Intel Core i7-2600K @
3.40GHz8,501$379.97Intel Core i7-2600 @ 3.40GHz8,242$214.99Intel Core i7-4720HQ @
2.60GHz8,046NAAMD FX-8320 Eight-Core8,008$145.99Intel Core i7-6700HQ @
2.60GHz7,997$1509Intel Core i7-4710HQ @ 2.50GHz7,826NAIntel Core i5-6600K @
3.50GHz7,762$239.99Intel Core i7-4700HQ @ 2.40GHz7,754$383.00Intel Core i7-4700MQ
@ 2.40GHz7,736$467.40Intel Core i5-4690K @ 3.50GHz7,690$239.99AMD FX-8150 Eight-
Core7,619$165.99Intel Core i7-3630QM @ 2.40GHz7,604$304.49Intel Core i5-4670K @
3.40GHz7,598$249.99Intel Core i5-4690 @ 3.50GHz7,542$224.99Intel Core i7-3610QM @
2.30GHz7,460$399.99Intel Core i5-4670 @ 3.40GHz7,342$226.99Intel Core i5-4590 @
3.30GHz7,174$199.99Intel Core i7-4702MQ @ 2.20GHz7,146NAIntel Core i5-3570K @
3.40GHz7,130$477.23
Solution
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
public class Main
{
/**
* This the main function that runs at the start
* param args - input arguments from the command line
*/
static public void main(String[] args)
{
CPUList cpuList = new CPUList(); //The CPUList used to retrieve data from the
fiile and store in the db
CPUList cpuListRetrieved = new CPUList(); //The CPUList used to retrieve data from the
database
CpuDb cpuDb = new CpuDb(); //The database object used to move data to and
from the CPU Lists
try
{
//Read in the file and store each line into the CPU objects in a list
Files.lines(Paths.get("Project04Data.csv"))
.map(line -> line.split("  ")) // Stream
.flatMap(Arrays::stream) // Stream
.forEach(line -> cpuList.AddCpu(line));
//Clear the list table for the new listing
cpuDb.Clear();
//Insert the Cpu List into the database
cpuDb.SetCpuList(cpuList);
//Retrieve the Cpu List into a different CPU List object from the database
cpuDb.GetCpuList(cpuListRetrieved);
//Show the report from the new list that was retrieved from the database
cpuListRetrieved.ShowReport();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
CPUList.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class CPUList
{
ArrayList theList = new ArrayList<>();
/**
* Default constructor for the CPU
*/
public void CPUList()
{
}
/**
* param strInputLine Input line to be used in creating the CPU object
*/
public void AddCpu(String strInputLine)
{
theList.add(new CPU(strInputLine));
}
/**
* param tempCPU - A CPU object to add to the list
*/
public void AddCpu(CPU tempCPU)
{
theList.add(tempCPU);
}
/**
* return the combined string showing the CPU list
*/
public String toString()
{
String strString = "";
for (CPU cpu : theList)
{
strString += cpu;
}
return(strString);
}
/**
* Print the CPU List Statistics
* average price of CPU's
* highest priced CPU
* lowest priced CPU
* best value CPU (performance / price )*
*/
public void PrintStatistics()
{
System.out.printf("average price CPU: %5.2f ",
theList.stream().mapToDouble(CPU::getPrice).average().getAsDouble());
System.out.printf("highest price CPU: %5.2f ",
theList.stream().mapToDouble(CPU::getPrice).max().getAsDouble());
System.out.printf("lowest price CPU: %5.2f ",
theList.stream().mapToDouble(CPU::getPrice).min().getAsDouble());
System.out.println("Best Value CPU: " + Collections.max( theList, new
CpuComparator() ).getCpuName());
}
/**
*Create the report from the database table with the following format
*
* Intel Core i7-6700HQ 2.60GHz: $1,509.00
* Intel Core i7-3770K 3.50GHz: $560.50
* Intel Core i5-3570K 3.40GHz: $477.23
* Intel Core i7-4700MQ 2.40GHz: $467.40
*/
public void ShowReport()
{
for(CPU objCpu : theList)
{
System.out.printf("%s: %5.2f ", objCpu.getCpuName(), objCpu.getPrice());
}
}
/**
* Remove the CPU objects that do not have all of the required values parsed out of the line
*/
public void CleanCpuList()
{
Iterator it = theList.iterator();
while( it.hasNext() )
{
CPU objCpu = it.next();
if(objCpu.getValid() == false)
{
it.remove();
}
}
}
}
CPU.java
public class CPU
{
private boolean m_bValid;
private String m_strCPULine;
private String m_strCPUName;
private double m_dPerformance;
private double m_dPrice;
private double m_dValue; //Performance / Price
private static final double NA_VALUE = 9999.99;
/**
* param strCPULine is the CPU line from the file
*/
public CPU(String strCPULine)
{
m_strCPULine = strCPULine;
m_bValid = ParseCPULine(strCPULine);
}
/**
* Constructor to be used when the fields are already known
* param strCPUName - name of the CPU
* param iPerformance - performance factor of the CPU
* param dPrice - price of the CPU
*/
public CPU(String strCPUName, int iPerformance, double dPrice)
{
m_strCPUName = strCPUName;
m_dPerformance = (double)iPerformance;
m_dPrice = dPrice;
m_dValue = m_dPerformance / m_dPrice; //Performance / Price
m_bValid = true;
}
/**
* param m_strCPULine - the input file line to be parsed
* return Indicate if the ParseCPULin succeeded or not
*/
private boolean ParseCPULine(String m_strCPULine)
{
boolean bRetValue = true;
String strTemp;
String strNumeric;
//Use a regular expression to parse the line into the individual members
//TODO - Figure out why regex not working for 1,509.00
//messes up on the comma in the value
String[] tokens = m_strCPULine.split(",(?=([^"]*"[^"]*")*[^"]*$)");
//http://rubular.com/ is helpful for regex
//Do we have the correct number of tokens from the split. If not then mark as invalid
if(tokens.length != 3)
{
bRetValue = false;
}
m_strCPUName = tokens[0];
//Get the performance
try
{
strTemp = tokens[1];
strNumeric = strTemp.replaceAll("[^0-9.]+", ""); //Get rid of non digit characters
m_dPerformance = Double.parseDouble(strNumeric);
}
catch(NumberFormatException ex)
{
m_dPerformance = NA_VALUE;
bRetValue = false;
}
//Get the price
try
{
strTemp = tokens[2];
strNumeric = strTemp.replaceAll("[^0-9.]+", ""); //Get rid of non digit characters
m_dPrice = Double.parseDouble(strNumeric);
}
catch(NumberFormatException ex)
{
m_dPrice = NA_VALUE; //Bogus Value
bRetValue = false;
}
//If we have valid Performance and Price values then return the calculated value otherwise
set to zero
if(bRetValue)
{
m_dValue = m_dPerformance / m_dPrice;
}
else
{
m_dValue = 0.0;
}
// for(String strTemp1 : tokens)
// {
// System.out.printf("%st", strTemp1);
// }
//
// System.out.printf(" ");
return bRetValue;
}
/**
* return A string representing the CPU
*/
public String toString()
{
return String.format("[%b]t%stt[%5.2f]t[%5.2f] ", m_bValid, m_strCPUName,
m_dPerformance, m_dPrice);
//return String.format("%s ", m_strCPULine); //Just return the original line
}
/**
* Getter
* return the performance as an double
*/
public double getPerformance(){return(m_dPerformance);};
/**
* Getter
* return the price as a double
*/
public double getPrice(){return(m_dPrice);};
/**
* Getter
* return the value as a double
*/
public double getValue(){return(m_dValue);};
/**
* Getter
* return the CPU Name
*/
public String getCpuName(){return(m_strCPUName);};
/**
* return if the cpu's line was parsed with all valid values for the fields or not
*/
public boolean getValid(){return(m_bValid);};
}
CPUDb.java
import java.sql.*;
public class CpuDb
{
//SQL objects
Connection c = null;
boolean bConnected = false;
/**
* Default constructor
*/
public CpuDb()
{
bConnected = Connect("cpudb", "tcc2016", "tcc2016");
}
/**
* param strTable - table for which the column names will be shown
*/
public void ShowColumns(String strTable)
{
Statement s = null;
ResultSet r = null;
try
{
s = c.createStatement();
r = s.executeQuery("SELECT * from " + strTable);
ResultSetMetaData m = r.getMetaData();
int col = m.getColumnCount();
for (int i = 1; i <= col; i++)
{
System.out.printf("%stt", m.getColumnName(i));
}
System.out.println();
}
catch ( SQLException e)
{
e.printStackTrace();
}
}
/**
* Connect to the database
* param strDatabase - database name
* param strUser - database user
* param strPassword - user password
* return true if the connection is made
*/
private boolean Connect(String strDatabase, String strUser, String strPassword)
{
boolean bConnectStatus = false;
try
{
//Had to suppress a SSL warning message that kept popping up
c = DriverManager.getConnection("jdbc:mysql://localhost/" + strDatabase +
"?autoReconnect=true&useSSL=false", strUser, strPassword);
System.out.println("Database connection made ");
bConnectStatus = true;
}
catch ( SQLException e)
{
e.printStackTrace();
}
return(bConnectStatus);
}
/**
* Provide the insert into the database of the CPU list
* param lstCpu - list of CPUs to insert
* return true if the setting of the db via inserts succeeded
*/
public boolean SetCpuList(CPUList lstCpu)
{
boolean retValue = false;
Statement s = null;
String strSql;
ResultSet r = null;
try
{
s = c.createStatement();
//"insert into cputable( cpuname, performance, price) values( 'CPU1', 123, 55.66)"
for(CPU objCPU : lstCpu.theList)
{
//Only insert if valid
if(objCPU.getValid() == true)
{
//Create the CPU
strSql = "insert into cputable( cpuname, performance, price) values('"
+ objCPU.getCpuName() + "',"
+ objCPU.getPerformance() + ","
+ objCPU.getPrice() + ")";
//System.out.println(strSql);
s.execute(strSql);
}
}
}
catch ( SQLException e)
{
e.printStackTrace();
}
return (retValue);
}
/**
* Get the CPU list from the the database and return the list
* param lstCpu - list of CPUs in the database
* return indicates if the loading of the cpu list from the database succeeded or not
*/
public boolean GetCpuList(CPUList lstCpu)
{
boolean retValue = false;
Statement s = null;
ResultSet r = null;
try
{
//Get the statement object connected to the database
s = c.createStatement();
//Get all of the fields from the cpu table
r = s.executeQuery("SELECT * from cputable order by price DESC");
//Get the results set for the query
ResultSetMetaData m = r.getMetaData();
//Iterate through the record set and add to the CPU list
while( r.next() ){
lstCpu.AddCpu(new CPU(r.getString( "cpuname" ),r.getInt( "performance"
),r.getFloat( "price" )));
}
// //How many columns do we have
// int col = m.getColumnCount();
//
// //Show all of the data in the results set
// while( r.next() ){
// for( int i = 1; i <= col; i++ ){
// int t = m.getColumnType( i );
// switch( t ){
// case Types.INTEGER:
// System.out.print( r.getInt( i ) );
// break;
// case Types.VARCHAR:
// System.out.print( r.getString( i ) );
// break;
// case Types.DATE:
// System.out.print( r.getDate( i ) );
// break;
// case Types.FLOAT:
// System.out.print( r.getFloat( i ) );
// break;
// default:
// System.out.print("Unk("+ r.getType() + ")");
// break;
// }
// System.out.print( ";" );
// }
// System.out.println();
// }
retValue = true;
}
catch ( SQLException e)
{
e.printStackTrace();
}
return (retValue);
}
/**
* Clear the data out of the database
* return if the table was cleared or not
*/
public boolean Clear()
{
boolean retValue = false;
Statement s = null;
ResultSet r = null;
try
{
//Get the statement object connected to the database
s = c.createStatement();
//Get all of the fields from the cpu table
s.execute("delete from cputable");
}
catch ( SQLException e)
{
e.printStackTrace();
}
return (retValue);
}
}
Project04Data.csv
CPU Name,Performance,Price (USD)
Intel Core i7-3770K @ 3.50GHz,"9,556",$560.50
Intel Core i7-3770 @ 3.40GHz,"9,327",$335.55
Intel Core i7-3820 @ 3.60GHz,"8,990",$404.38
AMD FX-8350 Eight-Core,"8,940",$149.99
Intel Core i7-2600K @ 3.40GHz,"8,501",$379.97
Intel Core i7-2600 @ 3.40GHz,"8,242",$214.99
Intel Core i7-4720HQ @ 2.60GHz,"8,046",NA
AMD FX-8320 Eight-Core,"8,008",$145.99
Intel Core i7-6700HQ @ 2.60GHz,"7,997",$1,509.00
Intel Core i7-4710HQ @ 2.50GHz,"7,826",NA
Intel Core i5-6600K @ 3.50GHz,"7,762",$239.99
Intel Core i7-4700HQ @ 2.40GHz,"7,754",$383.00
Intel Core i7-4700MQ @ 2.40GHz,"7,736",$467.40
Intel Core i5-4690K @ 3.50GHz,"7,690",$239.99
AMD FX-8150 Eight-Core,"7,619",$165.99
Intel Core i7-3630QM @ 2.40GHz,"7,604",$304.49
Intel Core i5-4670K @ 3.40GHz,"7,598",$249.99
Intel Core i5-4690 @ 3.50GHz,"7,542",$224.99
Intel Core i7-3610QM @ 2.30GHz,"7,460",$399.99
Intel Core i5-4670 @ 3.40GHz,"7,342",$226.99
Intel Core i5-4590 @ 3.30GHz,"7,174",$199.99
Intel Core i7-4702MQ @ 2.20GHz,"7,146",NA
Intel Core i5-3570K @ 3.40GHz,"7,130",$477.23
CpuComparator.java
import java.util.Comparator;
public class CpuComparator implements Comparator< CPU >
{
/**
* Compare function to return which cpu has better performance
* @param c1 - first cpu object
* @param c2 - second cpu object
* @return
*/
public int compare(CPU c1, CPU c2 )
{
double c1Value = c1.getValue();
double c2Value = c2.getValue();
return (int)(c1Value - c2Value);
}
}

More Related Content

PDF
Create a Java FX GUI program that allows the user to insert data int.pdf
PDF
Java Programming Projects
PDF
JAVA...With N.E.T_B.E.A.N.S___________________________________.pdf
PDF
database propertiesjdbc.url=jdbcderbyBigJavaDB;create=true # .pdf
PDF
This is a java lab assignment. I have added the first part java re.pdf
PPS
Jdbc example program with access and MySql
PDF
Connect2016 AD1387 Integrate with XPages and Java
PDF
AD1387: Outside The Box: Integrating with Non-Domino Apps using XPages and Ja...
Create a Java FX GUI program that allows the user to insert data int.pdf
Java Programming Projects
JAVA...With N.E.T_B.E.A.N.S___________________________________.pdf
database propertiesjdbc.url=jdbcderbyBigJavaDB;create=true # .pdf
This is a java lab assignment. I have added the first part java re.pdf
Jdbc example program with access and MySql
Connect2016 AD1387 Integrate with XPages and Java
AD1387: Outside The Box: Integrating with Non-Domino Apps using XPages and Ja...

Similar to Create a JAVA program that performs file IO and database interaction.pdf (20)

PPT
flash-backedVMDB
PDF
Column and hadoop
PPTX
HBase_-_data_operaet le opérations de calciletions_final.pptx
PDF
This is the official tutorial from Oracle.httpdocs.oracle.comj.pdf
DOC
Ip project
PDF
High Performance With Java
DOCX
VISUALIZAR REGISTROS EN UN JTABLE
PDF
ARabia hossain project report.pdf
PPTX
H base programming
DOCX
Db examples
PDF
PPTX
Hadoop Summit 2014: Query Optimization and JIT-based Vectorized Execution in ...
PPTX
Apache Tajo: Query Optimization Techniques and JIT-based Vectorized Engine
PDF
Hw09 Sqoop Database Import For Hadoop
PDF
Modify this code to change the underlying data structure to .pdf
PDF
Modify the project so tat records are inserted into the random acess.pdf
PDF
spring-tutorial
PDF
For this lab, you will write the following filesAbstractDataCalc.pdf
PPTX
Sql sever engine batch mode and cpu architectures
PPT
Chapter 2 Architecture and Classification of DBMS.ppt
flash-backedVMDB
Column and hadoop
HBase_-_data_operaet le opérations de calciletions_final.pptx
This is the official tutorial from Oracle.httpdocs.oracle.comj.pdf
Ip project
High Performance With Java
VISUALIZAR REGISTROS EN UN JTABLE
ARabia hossain project report.pdf
H base programming
Db examples
Hadoop Summit 2014: Query Optimization and JIT-based Vectorized Execution in ...
Apache Tajo: Query Optimization Techniques and JIT-based Vectorized Engine
Hw09 Sqoop Database Import For Hadoop
Modify this code to change the underlying data structure to .pdf
Modify the project so tat records are inserted into the random acess.pdf
spring-tutorial
For this lab, you will write the following filesAbstractDataCalc.pdf
Sql sever engine batch mode and cpu architectures
Chapter 2 Architecture and Classification of DBMS.ppt
Ad

More from malavshah9013 (20)

PDF
gen diffuses Oxygen enters a from the blood to red blood cell. the bo.pdf
PDF
Fill in parameters Public New Hash table (int initial Capacity, floa.pdf
PDF
For Phantom Limb Syndrome, please describe the symptoms and the part .pdf
PDF
Explain why the organisms that were studied by Sergei Winogradsky co.pdf
PDF
Electron transport powers the first steps of photosynthesis. The fo.pdf
PDF
Describe 5 key traits the lung cancer cells within the primary tumor.pdf
PDF
Complete the ANOVA tableSourceDFSSMSBetween Groups35.pdf
PDF
English Composition II - mutiple questions on researchQuestion 1 o.pdf
PDF
Customers arrive at a bank tellers booth at a rate of 2 per minute.pdf
PDF
Wolves were hunted and poisoned to extinction in Sweden and Norway b.pdf
PDF
Describe the differences between OpenPGP, PGP and GPG.Solution.pdf
PDF
Declaring a PointerTo define a pointer, use an asterisk, (), in t.pdf
PDF
Who identified three key economic “advantages” that firms should hav.pdf
PDF
Which of these is the largesta. The surface zoneb. The mixed la.pdf
PDF
Which of the following concepts is exemplified by the story of Parus .pdf
PDF
You will be implementing the following functions. You may modify the.pdf
PDF
When Elvis swims with the current, he swims 18km in 2 hours. Against.pdf
PDF
What tarsal is lateral to the medial cuneiform What tarsal is .pdf
PDF
What is the definition of memory access timeA. The difference bet.pdf
PDF
What are the main challenges to be dealt within a distributed operat.pdf
gen diffuses Oxygen enters a from the blood to red blood cell. the bo.pdf
Fill in parameters Public New Hash table (int initial Capacity, floa.pdf
For Phantom Limb Syndrome, please describe the symptoms and the part .pdf
Explain why the organisms that were studied by Sergei Winogradsky co.pdf
Electron transport powers the first steps of photosynthesis. The fo.pdf
Describe 5 key traits the lung cancer cells within the primary tumor.pdf
Complete the ANOVA tableSourceDFSSMSBetween Groups35.pdf
English Composition II - mutiple questions on researchQuestion 1 o.pdf
Customers arrive at a bank tellers booth at a rate of 2 per minute.pdf
Wolves were hunted and poisoned to extinction in Sweden and Norway b.pdf
Describe the differences between OpenPGP, PGP and GPG.Solution.pdf
Declaring a PointerTo define a pointer, use an asterisk, (), in t.pdf
Who identified three key economic “advantages” that firms should hav.pdf
Which of these is the largesta. The surface zoneb. The mixed la.pdf
Which of the following concepts is exemplified by the story of Parus .pdf
You will be implementing the following functions. You may modify the.pdf
When Elvis swims with the current, he swims 18km in 2 hours. Against.pdf
What tarsal is lateral to the medial cuneiform What tarsal is .pdf
What is the definition of memory access timeA. The difference bet.pdf
What are the main challenges to be dealt within a distributed operat.pdf
Ad

Recently uploaded (20)

PDF
Microbial disease of the cardiovascular and lymphatic systems
PPTX
202450812 BayCHI UCSC-SV 20250812 v17.pptx
PDF
GENETICS IN BIOLOGY IN SECONDARY LEVEL FORM 3
PDF
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
PDF
RMMM.pdf make it easy to upload and study
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PDF
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PPTX
Introduction-to-Literarature-and-Literary-Studies-week-Prelim-coverage.pptx
PDF
O7-L3 Supply Chain Operations - ICLT Program
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
PDF
Chinmaya Tiranga quiz Grand Finale.pdf
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PDF
Anesthesia in Laparoscopic Surgery in India
PPTX
Lesson notes of climatology university.
PDF
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
PPTX
Pharma ospi slides which help in ospi learning
PPTX
GDM (1) (1).pptx small presentation for students
PDF
Abdominal Access Techniques with Prof. Dr. R K Mishra
Microbial disease of the cardiovascular and lymphatic systems
202450812 BayCHI UCSC-SV 20250812 v17.pptx
GENETICS IN BIOLOGY IN SECONDARY LEVEL FORM 3
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
RMMM.pdf make it easy to upload and study
Final Presentation General Medicine 03-08-2024.pptx
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
Final Presentation General Medicine 03-08-2024.pptx
Introduction-to-Literarature-and-Literary-Studies-week-Prelim-coverage.pptx
O7-L3 Supply Chain Operations - ICLT Program
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
Chinmaya Tiranga quiz Grand Finale.pdf
O5-L3 Freight Transport Ops (International) V1.pdf
Microbial diseases, their pathogenesis and prophylaxis
Anesthesia in Laparoscopic Surgery in India
Lesson notes of climatology university.
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
Pharma ospi slides which help in ospi learning
GDM (1) (1).pptx small presentation for students
Abdominal Access Techniques with Prof. Dr. R K Mishra

Create a JAVA program that performs file IO and database interaction.pdf

  • 1. Create a JAVA program that performs file IO and database interaction via SQL. The program needs to read data from the provided file: "Project.csv" and insert the data into a database. Then the program needs to create a report from the database sorted by price descending. The report should be in the format demonstrated below. id (primary key - generated by the database) cpuname performance price Project.csv contents:CPU NamePerformancePrice (USD)Intel Core i7-3770K @ 3.50GHz9,556$560.50Intel Core i7-3770 @ 3.40GHz9,327$335.55Intel Core i7-3820 @ 3.60GHz8,990$404.38AMD FX-8350 Eight-Core8,940$149.99Intel Core i7-2600K @ 3.40GHz8,501$379.97Intel Core i7-2600 @ 3.40GHz8,242$214.99Intel Core i7-4720HQ @ 2.60GHz8,046NAAMD FX-8320 Eight-Core8,008$145.99Intel Core i7-6700HQ @ 2.60GHz7,997$1509Intel Core i7-4710HQ @ 2.50GHz7,826NAIntel Core i5-6600K @ 3.50GHz7,762$239.99Intel Core i7-4700HQ @ 2.40GHz7,754$383.00Intel Core i7-4700MQ @ 2.40GHz7,736$467.40Intel Core i5-4690K @ 3.50GHz7,690$239.99AMD FX-8150 Eight- Core7,619$165.99Intel Core i7-3630QM @ 2.40GHz7,604$304.49Intel Core i5-4670K @ 3.40GHz7,598$249.99Intel Core i5-4690 @ 3.50GHz7,542$224.99Intel Core i7-3610QM @ 2.30GHz7,460$399.99Intel Core i5-4670 @ 3.40GHz7,342$226.99Intel Core i5-4590 @ 3.30GHz7,174$199.99Intel Core i7-4702MQ @ 2.20GHz7,146NAIntel Core i5-3570K @ 3.40GHz7,130$477.23 Solution import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; public class Main { /** * This the main function that runs at the start * param args - input arguments from the command line */ static public void main(String[] args)
  • 2. { CPUList cpuList = new CPUList(); //The CPUList used to retrieve data from the fiile and store in the db CPUList cpuListRetrieved = new CPUList(); //The CPUList used to retrieve data from the database CpuDb cpuDb = new CpuDb(); //The database object used to move data to and from the CPU Lists try { //Read in the file and store each line into the CPU objects in a list Files.lines(Paths.get("Project04Data.csv")) .map(line -> line.split(" ")) // Stream .flatMap(Arrays::stream) // Stream .forEach(line -> cpuList.AddCpu(line)); //Clear the list table for the new listing cpuDb.Clear(); //Insert the Cpu List into the database cpuDb.SetCpuList(cpuList); //Retrieve the Cpu List into a different CPU List object from the database cpuDb.GetCpuList(cpuListRetrieved); //Show the report from the new list that was retrieved from the database cpuListRetrieved.ShowReport(); } catch (IOException e) { e.printStackTrace(); } } } CPUList.java import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; public class CPUList {
  • 3. ArrayList theList = new ArrayList<>(); /** * Default constructor for the CPU */ public void CPUList() { } /** * param strInputLine Input line to be used in creating the CPU object */ public void AddCpu(String strInputLine) { theList.add(new CPU(strInputLine)); } /** * param tempCPU - A CPU object to add to the list */ public void AddCpu(CPU tempCPU) { theList.add(tempCPU); } /** * return the combined string showing the CPU list */ public String toString() { String strString = ""; for (CPU cpu : theList) { strString += cpu; } return(strString); } /** * Print the CPU List Statistics * average price of CPU's
  • 4. * highest priced CPU * lowest priced CPU * best value CPU (performance / price )* */ public void PrintStatistics() { System.out.printf("average price CPU: %5.2f ", theList.stream().mapToDouble(CPU::getPrice).average().getAsDouble()); System.out.printf("highest price CPU: %5.2f ", theList.stream().mapToDouble(CPU::getPrice).max().getAsDouble()); System.out.printf("lowest price CPU: %5.2f ", theList.stream().mapToDouble(CPU::getPrice).min().getAsDouble()); System.out.println("Best Value CPU: " + Collections.max( theList, new CpuComparator() ).getCpuName()); } /** *Create the report from the database table with the following format * * Intel Core i7-6700HQ 2.60GHz: $1,509.00 * Intel Core i7-3770K 3.50GHz: $560.50 * Intel Core i5-3570K 3.40GHz: $477.23 * Intel Core i7-4700MQ 2.40GHz: $467.40 */ public void ShowReport() { for(CPU objCpu : theList) { System.out.printf("%s: %5.2f ", objCpu.getCpuName(), objCpu.getPrice()); } } /** * Remove the CPU objects that do not have all of the required values parsed out of the line */ public void CleanCpuList() {
  • 5. Iterator it = theList.iterator(); while( it.hasNext() ) { CPU objCpu = it.next(); if(objCpu.getValid() == false) { it.remove(); } } } } CPU.java public class CPU { private boolean m_bValid; private String m_strCPULine; private String m_strCPUName; private double m_dPerformance; private double m_dPrice; private double m_dValue; //Performance / Price private static final double NA_VALUE = 9999.99; /** * param strCPULine is the CPU line from the file */ public CPU(String strCPULine) { m_strCPULine = strCPULine; m_bValid = ParseCPULine(strCPULine); } /** * Constructor to be used when the fields are already known * param strCPUName - name of the CPU * param iPerformance - performance factor of the CPU
  • 6. * param dPrice - price of the CPU */ public CPU(String strCPUName, int iPerformance, double dPrice) { m_strCPUName = strCPUName; m_dPerformance = (double)iPerformance; m_dPrice = dPrice; m_dValue = m_dPerformance / m_dPrice; //Performance / Price m_bValid = true; } /** * param m_strCPULine - the input file line to be parsed * return Indicate if the ParseCPULin succeeded or not */ private boolean ParseCPULine(String m_strCPULine) { boolean bRetValue = true; String strTemp; String strNumeric; //Use a regular expression to parse the line into the individual members //TODO - Figure out why regex not working for 1,509.00 //messes up on the comma in the value String[] tokens = m_strCPULine.split(",(?=([^"]*"[^"]*")*[^"]*$)"); //http://rubular.com/ is helpful for regex //Do we have the correct number of tokens from the split. If not then mark as invalid if(tokens.length != 3) { bRetValue = false; } m_strCPUName = tokens[0]; //Get the performance try { strTemp = tokens[1]; strNumeric = strTemp.replaceAll("[^0-9.]+", ""); //Get rid of non digit characters m_dPerformance = Double.parseDouble(strNumeric);
  • 7. } catch(NumberFormatException ex) { m_dPerformance = NA_VALUE; bRetValue = false; } //Get the price try { strTemp = tokens[2]; strNumeric = strTemp.replaceAll("[^0-9.]+", ""); //Get rid of non digit characters m_dPrice = Double.parseDouble(strNumeric); } catch(NumberFormatException ex) { m_dPrice = NA_VALUE; //Bogus Value bRetValue = false; } //If we have valid Performance and Price values then return the calculated value otherwise set to zero if(bRetValue) { m_dValue = m_dPerformance / m_dPrice; } else { m_dValue = 0.0; } // for(String strTemp1 : tokens) // { // System.out.printf("%st", strTemp1); // } // // System.out.printf(" "); return bRetValue; }
  • 8. /** * return A string representing the CPU */ public String toString() { return String.format("[%b]t%stt[%5.2f]t[%5.2f] ", m_bValid, m_strCPUName, m_dPerformance, m_dPrice); //return String.format("%s ", m_strCPULine); //Just return the original line } /** * Getter * return the performance as an double */ public double getPerformance(){return(m_dPerformance);}; /** * Getter * return the price as a double */ public double getPrice(){return(m_dPrice);}; /** * Getter * return the value as a double */ public double getValue(){return(m_dValue);}; /** * Getter * return the CPU Name */ public String getCpuName(){return(m_strCPUName);}; /** * return if the cpu's line was parsed with all valid values for the fields or not */ public boolean getValid(){return(m_bValid);}; }
  • 9. CPUDb.java import java.sql.*; public class CpuDb { //SQL objects Connection c = null; boolean bConnected = false; /** * Default constructor */ public CpuDb() { bConnected = Connect("cpudb", "tcc2016", "tcc2016"); } /** * param strTable - table for which the column names will be shown */ public void ShowColumns(String strTable) { Statement s = null; ResultSet r = null; try { s = c.createStatement(); r = s.executeQuery("SELECT * from " + strTable); ResultSetMetaData m = r.getMetaData(); int col = m.getColumnCount(); for (int i = 1; i <= col; i++) { System.out.printf("%stt", m.getColumnName(i)); } System.out.println(); } catch ( SQLException e) { e.printStackTrace();
  • 10. } } /** * Connect to the database * param strDatabase - database name * param strUser - database user * param strPassword - user password * return true if the connection is made */ private boolean Connect(String strDatabase, String strUser, String strPassword) { boolean bConnectStatus = false; try { //Had to suppress a SSL warning message that kept popping up c = DriverManager.getConnection("jdbc:mysql://localhost/" + strDatabase + "?autoReconnect=true&useSSL=false", strUser, strPassword); System.out.println("Database connection made "); bConnectStatus = true; } catch ( SQLException e) { e.printStackTrace(); } return(bConnectStatus); } /** * Provide the insert into the database of the CPU list * param lstCpu - list of CPUs to insert * return true if the setting of the db via inserts succeeded */ public boolean SetCpuList(CPUList lstCpu) { boolean retValue = false; Statement s = null;
  • 11. String strSql; ResultSet r = null; try { s = c.createStatement(); //"insert into cputable( cpuname, performance, price) values( 'CPU1', 123, 55.66)" for(CPU objCPU : lstCpu.theList) { //Only insert if valid if(objCPU.getValid() == true) { //Create the CPU strSql = "insert into cputable( cpuname, performance, price) values('" + objCPU.getCpuName() + "'," + objCPU.getPerformance() + "," + objCPU.getPrice() + ")"; //System.out.println(strSql); s.execute(strSql); } } } catch ( SQLException e) { e.printStackTrace(); } return (retValue); } /** * Get the CPU list from the the database and return the list * param lstCpu - list of CPUs in the database * return indicates if the loading of the cpu list from the database succeeded or not */ public boolean GetCpuList(CPUList lstCpu) { boolean retValue = false;
  • 12. Statement s = null; ResultSet r = null; try { //Get the statement object connected to the database s = c.createStatement(); //Get all of the fields from the cpu table r = s.executeQuery("SELECT * from cputable order by price DESC"); //Get the results set for the query ResultSetMetaData m = r.getMetaData(); //Iterate through the record set and add to the CPU list while( r.next() ){ lstCpu.AddCpu(new CPU(r.getString( "cpuname" ),r.getInt( "performance" ),r.getFloat( "price" ))); } // //How many columns do we have // int col = m.getColumnCount(); // // //Show all of the data in the results set // while( r.next() ){ // for( int i = 1; i <= col; i++ ){ // int t = m.getColumnType( i ); // switch( t ){ // case Types.INTEGER: // System.out.print( r.getInt( i ) ); // break; // case Types.VARCHAR: // System.out.print( r.getString( i ) ); // break; // case Types.DATE: // System.out.print( r.getDate( i ) ); // break; // case Types.FLOAT: // System.out.print( r.getFloat( i ) ); // break;
  • 13. // default: // System.out.print("Unk("+ r.getType() + ")"); // break; // } // System.out.print( ";" ); // } // System.out.println(); // } retValue = true; } catch ( SQLException e) { e.printStackTrace(); } return (retValue); } /** * Clear the data out of the database * return if the table was cleared or not */ public boolean Clear() { boolean retValue = false; Statement s = null; ResultSet r = null; try { //Get the statement object connected to the database s = c.createStatement(); //Get all of the fields from the cpu table s.execute("delete from cputable"); } catch ( SQLException e) { e.printStackTrace(); }
  • 14. return (retValue); } } Project04Data.csv CPU Name,Performance,Price (USD) Intel Core i7-3770K @ 3.50GHz,"9,556",$560.50 Intel Core i7-3770 @ 3.40GHz,"9,327",$335.55 Intel Core i7-3820 @ 3.60GHz,"8,990",$404.38 AMD FX-8350 Eight-Core,"8,940",$149.99 Intel Core i7-2600K @ 3.40GHz,"8,501",$379.97 Intel Core i7-2600 @ 3.40GHz,"8,242",$214.99 Intel Core i7-4720HQ @ 2.60GHz,"8,046",NA AMD FX-8320 Eight-Core,"8,008",$145.99 Intel Core i7-6700HQ @ 2.60GHz,"7,997",$1,509.00 Intel Core i7-4710HQ @ 2.50GHz,"7,826",NA Intel Core i5-6600K @ 3.50GHz,"7,762",$239.99 Intel Core i7-4700HQ @ 2.40GHz,"7,754",$383.00 Intel Core i7-4700MQ @ 2.40GHz,"7,736",$467.40 Intel Core i5-4690K @ 3.50GHz,"7,690",$239.99 AMD FX-8150 Eight-Core,"7,619",$165.99 Intel Core i7-3630QM @ 2.40GHz,"7,604",$304.49 Intel Core i5-4670K @ 3.40GHz,"7,598",$249.99 Intel Core i5-4690 @ 3.50GHz,"7,542",$224.99 Intel Core i7-3610QM @ 2.30GHz,"7,460",$399.99 Intel Core i5-4670 @ 3.40GHz,"7,342",$226.99 Intel Core i5-4590 @ 3.30GHz,"7,174",$199.99 Intel Core i7-4702MQ @ 2.20GHz,"7,146",NA Intel Core i5-3570K @ 3.40GHz,"7,130",$477.23 CpuComparator.java import java.util.Comparator; public class CpuComparator implements Comparator< CPU > { /** * Compare function to return which cpu has better performance * @param c1 - first cpu object
  • 15. * @param c2 - second cpu object * @return */ public int compare(CPU c1, CPU c2 ) { double c1Value = c1.getValue(); double c2Value = c2.getValue(); return (int)(c1Value - c2Value); } }