# Notes
Make use of methods to implement arrays. Arrays can be passed into parameter list and can be returned in the method block.
利用方法实现数组。 数组可以传递到参数列表中,并可以在方法块中返回。
Ex.
- Create array 创建数组
- Print array 打印数组
- Sort array (swapping elements by position) 对数组排序(按位置交换元素)
- Search array 搜索数组
- Highest value in array 数组中的最大值
- Lowest value in array 数组中的最小值
- Remove item (s) from array 从数组中删除元素
- Update item (s) from array 从数组更新元素
# Arrays vs ArrayLists intro
A challenge – merge two arrays together!
Have method to take in two arrays and return the merged array in sorted order.
将两个数组合并在一起!
想办法接受两个数组,并按顺序合并数组。
# Method 1
Check sizes of each array ( arrays X and Y )
Set size of new array to be merged ( array M )
Loop thru each array based on length of each array
Track current position of merged array M
Store each array value into new array M
Return array M
public static int[] mergeArray(int[]arrayX, int[]arrayY) { | |
// The size of the new array will be the sum of arrayX and arrayY sizes | |
int[] arrayM = new int[arrayX.length + arrayY.length]; | |
int i = 0, j = 0, currentPos = 0; | |
// Loop 1 | |
while (i < arrayX.length) | |
arrayM[currentPos++] = arrayX[i++]; | |
// loop 2 | |
while (j < arrayY.length) | |
arrayM[currentPos++] = arrayY[j++]; | |
return arrayM; | |
} |
# Method 2
ArrayList use case for merging 2 arrays
import java.util.ArrayList; | |
import java.util.Arrays; | |
//merge two arrays into an ArrayList | |
class MyMerge { | |
public static void main(String args[]) { | |
int[] a = { 1, 2, 3, 4 }; // Simple Array of integers 1 thru 4 | |
int[] b = { 5, 6, 7, 8, 9, 10 }; // Simple Array of integers 5 thru 10 | |
// Use dynamic Array list to hold merge of a and b 1 thru 10 | |
ArrayList<Integer> arrMerge = new ArrayList<Integer>(); | |
for (int i = 0; i < a.length; i++) // Loop thru array a and merge all items in a | |
{ | |
arrMerge.add(a[i]); | |
} | |
for (int i = 0; i < b.length; i++) // Loop thru array b and merge all items from b | |
{ | |
arrMerge.add(b[i]); | |
} | |
System.out.println(arrMerge); // Print Contents of final merged array | |
} | |
} |
Result:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# sort & search
Java built in methods can do the trick!
import java.util.*; | |
public class bSearch2 { | |
public static void main(String [] args) | |
{ | |
int[] myArray={5,4,3,2,1}; | |
Arrays.sort(myArray); | |
int result = Arrays.binarySearch(myArray, 3); | |
System.out.println((result >= 0 ? "Is found " : "Is not found ") + | |
" \nfound at position " + result); | |
} | |
} |
Bsearch trace revisited follows…
# Optimizing code
Finding the next best value in array if present!
import java.util.Arrays; | |
// classic case – BUT include next best value if Key is not present or found. | |
public class BSearch { | |
public static int bs(int[] a, int key) { | |
int lo = 0; | |
int hi = a.length - 1; | |
int mid=0; | |
while (lo <= hi) { | |
// Key is in a[lo..hi] or not present. | |
mid = (int) (hi + lo) / 2; | |
if (key < a[mid]) hi = mid - 1; | |
else if (key > a[mid]) lo = mid + 1; | |
else return mid; | |
} | |
return lo==hi ? mid : hi + 1; | |
} | |
public static void main(String[] args) { | |
int arr [] = new int[] {1,2,3,4,12,16}; | |
//sort the array | |
Arrays.sort(arr); | |
int i= bs(arr,2); //search for key item 2 from list | |
System.out.println(Math.abs(arr[i])); | |
} | |
} |
# Split function working in conjunction with an array
拆分函数与数组结合使用
The string split()
method breaks a given string ("tokenizes") around matches of the given regular expression.
String line = "a,b,c"; | |
String splitter[] = line.split(","); | |
splitter[0] = "a"; | |
splitter[1] = "b"; | |
splitter[2] = "c"; | |
// traverse data | |
// traditional loop | |
for (int i = 0; i < splitter.length; ++i) | |
System.out.println(splitter[i]); | |
System.out.println(); | |
// or use for enhanced or "for each" loop | |
for (String sObj : splitter) | |
System.out.println(sObj); |
Result:
结果均为a b c
# Lab
PROJECT
Bank record generationsObjective
To write a program that parses and processes bank data from a file.
# PROJECT DESCRIPTION
Bank of IIT has gotten their hands on some interesting data which will allow for possible loans to various clients from various regions.
Accompanying the labs specs is a csv (comma separated value) file namedbank-Detail.csv
which contains valuable raw data to allow the bank to process loans based on client details from the file.
You need to parse the data and print record data for future loan considerations.
# Project Details
Create an abstract class called
Client.java
to allow for three abstract methods the bank needs to process. Name your methodsreadData()
,processData()
andprintData()
. No arguments are needed for your methods.Create a
BankRecords.java
file which will utilize the Client asbtract methods and generate ultimately the client records from the csv file.The client file has the following header information
id {string} age {numeric} sex {FEMALE,MALE} region {INNER_CITY,TOWN,RURAL,SUBURBAN} income {numeric} married {NO,YES} children {0,1,2,3} car {NO,YES} save_act {NO,YES} current_act {NO,YES} mortgage {NO,YES} pep {YES,NO}
Create instance fields with appropriate data types for each header item above in your class. Include getter and setters for each instance field.
Include code definitions for each method declared in your Client class as follows
- Your
readData()
method should read in all the record data from the csv file in your path into an ArrayList. - Your
processData()
method should take all the record data from your ArrayList and add the data into each of your instance fields via your setters. Use an array of objects to store record data for each instance field. - Your
printData()
method should print the first 25 records for various fields to the console via your getters. Print records for the following fields:ID
,AGE
,SEX
,REGION
,INCOME
, andMORTGAGE
.
- Your
Include headings in your print detail.Printing record detail should be in a neat columnar style format.
Make sure to include a try catch block when reading any file!
Include also proper exception handling.
Include your project’s entire source code/csv file into a zip file, and in a separate Word file, your output snapshot/program description/source code as well.
# Objectives
# UML Design of classes
Error: Failed to launch the browser process! spawn /Applications/Google Chrome.app/Contents/MacOS/Google Chrome ENOENT TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md
Client.java
source setupCreate class file as abstract
Include 3 abstract methods inheritable for your BankRecords class.
Ex. of abstract method.
public abstract class Client {
public abstract void readData(); //read file detail
//finish remaining methods
}
BankRecords.java
source setupAdd .csv source file to your project folder
Take your .csv file and add it to the root of your project folder.Create necessary class variables
//setup static objects for IO processing
//array of BankRecords objects
static BankRecords robjs[] = new BankRecords[600];
//arraylist to hold spreadsheet rows & columns
static ArrayList<List<String>> array = new ArrayList<>();
//instance fields
private String id;
private int age;
/*create remaining instance fields with appropriate data types*/
- Generate getters & setters for ALL your instance fields
From your menu go to Source > Generate Getters and Setters…
even though we don’t need all getters and setters for this lab, we may need them in subsequent labs!
Setup class functions to perform the following tasks
Read data from spreadsheet public void readData() {
BufferedReader br;
//initialize reader object and set file path to root of project
br = new BufferedReader(new FileReader (new File("bank-Detail.csv")));
String line;
//read each record in csv file
while ((line = br.readLine()) != null) {
//parse each record in csv file by a comma ( , )
//into a list stored in the arraylist-> Arrays
array.add(Arrays.asList(line.split(",")));
}
processData(); //call function for processing record data
}
Process data from arraylist public void processData() {
//create index for array while iterating thru arraylist
int idx=0;
//create for each loop to cycle thru arraylist of values
//and PASS that data into your record objects' setters
for (List<String> rowData: array) {
//initialize array of objects
robjs[idx] = new BankRecords();
//call setters below and populate them, item by item
robjs[idx].setId(rowData.get(0)); //get 1st column
robjs[idx].setAge(Integer.parseInt(rowData.get(1))); //get 2nd column
/*continue processing arraylist item values into each array object -> robjs[] by index*/
idx++;
}
printData(); //call function to print objects held in memory
}
Print data from array public void printData() {
//1. Set appropriate headings for displaying first 25 records
//2. Create for loop and print each record objects instance data
//3. Within for loop use appropriate formatting techniques to print out record detail
}
# Error trappings!
Make sure to include appropriate exception handling with try catch blocks for any file being processed.
*Make use of such runtime exceptions such as FileNotFoundException or other possible exceptions that may occur during the processing of any file(s).
# Print formatting hints
Use various print formatting for printing detailed record information especially to make output look professional and columnar like with the format specifier % symbol followed by a converter.
Popular converters to use include:
%f | float |
%d | int |
%s | string |
%n | newline |
Ex. of an appropriate heading that can be printed may be as follows:
System.out.println("ID\t\tAGE\t\tSEX\t\tREGION\t\tINCOME\t\tMORTGAGE"); |
# code
import java.io.BufferedReader; | |
import java.io.File; | |
import java.io.FileReader; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.List; | |
public class BankRecords extends Client { | |
//setup static objects for IO processing | |
//array of BankRecords objects | |
static BankRecords robjs[] = new BankRecords[600]; | |
//arraylist to hold spreadsheet rows & columns | |
static ArrayList<List<String>> array = new ArrayList<>(); | |
//instance fields | |
private String id; | |
private int age; | |
private String sex; | |
private String region; | |
private double income; | |
private String married; | |
private int children; | |
private String car; | |
private String save_act; | |
private String current_act; | |
private String mortgage; | |
private String pep; | |
@Override | |
public void readData() { | |
BufferedReader br = null; | |
//initialize reader object and set file path to root of project | |
try { | |
br = new BufferedReader(new FileReader (new File("bank-Detail.csv"))); | |
String line; | |
//read each record in csv file | |
while ((line = br.readLine()) != null) { | |
//parse each record in csv file by a comma ( , ) | |
//into a list stored in the arraylist-> Arrays | |
array.add(Arrays.asList(line.split(","))); | |
} | |
} catch (Exception e) { | |
System.err.println("There was a problem loading the file"); | |
} | |
processData(); //call function for processing record data | |
} | |
@Override | |
public void processData() { | |
//create index for array while iterating thru arraylist | |
int idx=0; | |
//create for each loop to cycle thru arraylist of values | |
//and PASS that data into your record objects' setters | |
for (List<String> rowData: array) { | |
//initialize array of objects | |
robjs[idx] = new BankRecords(); | |
//call setters below and populate them, item by item | |
robjs[idx].setId(rowData.get(0)); //get 1st column | |
robjs[idx].setAge(Integer.parseInt(rowData.get(1))); //get 2nd column | |
robjs[idx].setSex(rowData.get(2)); | |
robjs[idx].setRegion(rowData.get(3)); | |
robjs[idx].setIncome(Double.parseDouble(rowData.get(4))); | |
robjs[idx].setMarried(rowData.get(5)); | |
robjs[idx].setChildren(Integer.parseInt(rowData.get(6))); | |
robjs[idx].setCar(rowData.get(7)); | |
robjs[idx].setSave_act(rowData.get(8)); | |
robjs[idx].setCurrent_act(rowData.get(9)); | |
robjs[idx].setMortgage(rowData.get(10)); | |
robjs[idx].setPep(rowData.get(11)); | |
/*continue processing arraylist item values into each array object -> robjs[] by index*/ | |
idx++; | |
} | |
printData(); //call function to print objects held in memory | |
} | |
@Override | |
public void printData() { | |
//1. Set appropriate headings for displaying first 25 records | |
//2. Create for loop and print each record objects instance data | |
//3. Within for loop use appropriate formatting techniques to print out record detail | |
//Set heading | |
System.out.printf("First 25 Client details:\n\n%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "ID","Age","Sex","Region","Income","Mortgage"); | |
for (int i=0;i<25;i++){ | |
String s=String.format("%-10s\t%-10d\t%-10s\t%-10s\t%-10.2f\t%-10s", | |
robjs[i].getId(),robjs[i].getAge(),robjs[i].getSex(),robjs[i].getRegion(),robjs[i].getIncome(),robjs[i].getMortgage()); | |
System.out.println(s); | |
} | |
} | |
/** | |
* @return the id | |
*/ | |
public String getId() { | |
return id; | |
} | |
/** | |
* @param id the id to set | |
*/ | |
public void setId(String id) { | |
this.id = id; | |
} | |
/** | |
* @return the age | |
*/ | |
public int getAge() { | |
return age; | |
} | |
/** | |
* @param age the age to set | |
*/ | |
public void setAge(int age) { | |
this.age = age; | |
} | |
/** | |
* @return the sex | |
*/ | |
public String getSex() { | |
return sex; | |
} | |
/** | |
* @param sex the sex to set | |
*/ | |
public void setSex(String sex) { | |
this.sex = sex; | |
} | |
/** | |
* @return the region | |
*/ | |
public String getRegion() { | |
return region; | |
} | |
/** | |
* @param region the region to set | |
*/ | |
public void setRegion(String region) { | |
this.region = region; | |
} | |
/** | |
* @return the income | |
*/ | |
public double getIncome() { | |
return income; | |
} | |
/** | |
* @param income the income to set | |
*/ | |
public void setIncome(double income) { | |
this.income = income; | |
} | |
/** | |
* @return the married | |
*/ | |
public String getMarried() { | |
return married; | |
} | |
/** | |
* @param married the married to set | |
*/ | |
public void setMarried(String married) { | |
this.married = married; | |
} | |
/** | |
* @return the children | |
*/ | |
public int getChildren() { | |
return children; | |
} | |
/** | |
* @param children the children to set | |
*/ | |
public void setChildren(int children) { | |
this.children = children; | |
} | |
/** | |
* @return the car | |
*/ | |
public String getCar() { | |
return car; | |
} | |
/** | |
* @param car the car to set | |
*/ | |
public void setCar(String car) { | |
this.car = car; | |
} | |
/** | |
* @return the save_act | |
*/ | |
public String getSave_act() { | |
return save_act; | |
} | |
/** | |
* @param save_act the save_act to set | |
*/ | |
public void setSave_act(String save_act) { | |
this.save_act = save_act; | |
} | |
/** | |
* @return the current_act | |
*/ | |
public String getCurrent_act() { | |
return current_act; | |
} | |
/** | |
* @param current_act the current_act to set | |
*/ | |
public void setCurrent_act(String current_act) { | |
this.current_act = current_act; | |
} | |
/** | |
* @return the mortgage | |
*/ | |
public String getMortgage() { | |
return mortgage; | |
} | |
/** | |
* @param mortgage the mortgage to set | |
*/ | |
public void setMortgage(String mortgage) { | |
this.mortgage = mortgage; | |
} | |
/** | |
* @return the pep | |
*/ | |
public String getPep() { | |
return pep; | |
} | |
/** | |
* @param pep the pep to set | |
*/ | |
public void setPep(String pep) { | |
this.pep = pep; | |
} | |
} |
public class BankRecordsTest { | |
public static void main(String[] args) { | |
BankRecords br = new BankRecords(); | |
br.readData(); | |
} | |
} |
public abstract class Client { | |
public abstract void readData(); //read file detail | |
public abstract void processData(); //process file detail | |
public abstract void printData(); //print file detail | |
} |