From 87aa77b6c7c814a4ae3234ae3cdd98e07c760709 Mon Sep 17 00:00:00 2001 From: "Gabriel St. Angel" Date: Sun, 11 Oct 2020 00:08:34 -0500 Subject: [PATCH] commit --- .classpath | 49 ++++ .project | 23 ++ .settings/org.eclipse.jdt.apt.core.prefs | 2 + .settings/org.eclipse.jdt.core.prefs | 16 ++ .settings/org.eclipse.m2e.core.prefs | 4 + .~lock.Problem_Statement_2020_Final.docx# | 1 + .../CodingCompCsvUtil.java | 242 +++++++++++++++++- .../structures/Agent.java | 56 +++- .../structures/Claim.java | 40 +++ .../structures/Customer.java | 155 ++++++++++- .../structures/Dependent.java | 4 + .../structures/Vendor.java | 32 +++ target/classes/META-INF/MANIFEST.MF | 4 +- .../coding-competition/pom.properties | 8 +- .../CodingCompCsvUtil.class | Bin 3251 -> 10557 bytes .../structures/Agent.class | Bin 428 -> 1600 bytes .../structures/Claim.class | Bin 397 -> 1215 bytes .../structures/Customer.class | Bin 806 -> 4987 bytes .../structures/Dependent.class | Bin 384 -> 488 bytes .../structures/Vendor.class | Bin 419 -> 1297 bytes .../CodingCompCsvUtilTest.class | Bin 3972 -> 5230 bytes 21 files changed, 619 insertions(+), 17 deletions(-) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.apt.core.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 .~lock.Problem_Statement_2020_Final.docx# diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..1a99fc8 --- /dev/null +++ b/.classpath @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..14a0591 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + 2020-StateFarm-CodingCompetitionProblem + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..b33f257 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,16 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.~lock.Problem_Statement_2020_Final.docx# b/.~lock.Problem_Statement_2020_Final.docx# new file mode 100644 index 0000000..620c471 --- /dev/null +++ b/.~lock.Problem_Statement_2020_Final.docx# @@ -0,0 +1 @@ +,gabe,gabe-XPS-8500,10.10.2020 20:08,file:///home/gabe/.config/libreoffice/4; \ No newline at end of file diff --git a/src/main/java/sf/codingcompetition2020/CodingCompCsvUtil.java b/src/main/java/sf/codingcompetition2020/CodingCompCsvUtil.java index 58267da..c318c87 100644 --- a/src/main/java/sf/codingcompetition2020/CodingCompCsvUtil.java +++ b/src/main/java/sf/codingcompetition2020/CodingCompCsvUtil.java @@ -1,12 +1,23 @@ package sf.codingcompetition2020; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; import java.io.FileReader; +import java.io.IOException; import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Scanner; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -19,6 +30,7 @@ import sf.codingcompetition2020.structures.Agent; import sf.codingcompetition2020.structures.Claim; import sf.codingcompetition2020.structures.Customer; +import sf.codingcompetition2020.structures.Dependent; import sf.codingcompetition2020.structures.Vendor; public class CodingCompCsvUtil { @@ -29,10 +41,85 @@ public class CodingCompCsvUtil { * @param classType -- Class of entries being read in. * @return -- List of entries being returned. */ + @SuppressWarnings("unchecked") public List readCsvFile(String filePath, Class classType) { - + + try (Scanner scanner = new Scanner(new File(filePath));) { + scanner.nextLine(); + + String line = scanner.nextLine(); + if(classType == Agent.class) { + while (scanner.hasNextLine()) { + String[] params = line.split(","); + List output = new ArrayList(); + output.add(new Agent(Integer.parseInt(params[0]), params[1], params[2], + params[3],params[4])); + } + } + + + else if(classType == Claim.class) { + while (scanner.hasNextLine()) { + System.out.println(scanner.nextLine()); + String[] params = line.split(","); + for(String line1: params) { + System.out.println(line1); + } + List output = new ArrayList(); + output.add(new Claim(Integer.parseInt(params[0]),Integer.parseInt(params[1]), + Boolean.parseBoolean(params[2]), Integer.parseInt(params[3]))); + return (List) output; + } + } + + else if(classType == Customer.class) { + while (scanner.hasNextLine()) { + List output = new ArrayList(); + String[] params = line.split(","); + List dependentList = new ArrayList(); + if(line.indexOf("[") != -1) + { + String dependentChunk = line.substring(line.indexOf("["), line.indexOf("]")); + String[] dependents = dependentChunk.split(","); + + for(int i = 0; i < dependents.length; i+=2) { + dependentList.add( new Dependent(dependents[i].substring(dependents[i].indexOf(":\"") + 3, dependents[i].lastIndexOf("\"")).replaceAll("[^a-zA-Z0-9]", ""), + dependents[i +1].substring(dependents[i +1].indexOf(":\"") + 3, + dependents[i +1].lastIndexOf("\"")).replaceAll("[^a-zA-Z0-9]", ""))); + } + } + // get index of last dependent in params + int lastDependent = 8; + for(int i = 0; i < params.length -1; i++) { + if(params[i].contains("{")) lastDependent = i; + } + if(params.length == 15) { + output.add(new + Customer(Integer.parseInt(params[0]),params[1], params[2], + Integer.parseInt(params[3]), params[4], Integer.parseInt(params[5]), + Short.parseShort(params[6]), params[7], dependentList, + Boolean.parseBoolean(params[lastDependent]), Boolean.parseBoolean(params[lastDependent + 1]), + Boolean.parseBoolean(params[lastDependent + 2]), params[lastDependent + 3], Short.parseShort(params[lastDependent + 4]), + Integer.parseInt(params[lastDependent + 5]))); + } + return (List) output; + } + } + + + + + //return output; + + } catch (Exception e) { + // TODO Auto-generated catch block + System.out.println(e.toString()); + } + return null; } + + /* #2 * getAgentCountInArea() -- Return the number of agents in a given area. @@ -41,7 +128,18 @@ public List readCsvFile(String filePath, Class classType) { * @return -- The number of agents in a given area */ public int getAgentCountInArea(String filePath,String area) { - + int agentCount = 0; // Number of agents in the area + List agents = readCsvFile(filePath, Agent.class); + + // Loop through list add increment agentCount for every agent + // that is in the specified area + for (Agent a : agents) { + if(a.getArea().equals(area)) { + agentCount++; // Increment agent + } + } + + return agentCount; } @@ -53,7 +151,18 @@ public int getAgentCountInArea(String filePath,String area) { * @return -- The number of agents in a given area */ public List getAgentsInAreaThatSpeakLanguage(String filePath, String area, String language) { - + List list = readCsvFile(filePath, Agent.class); // List of all agents + List agents = new ArrayList(); // List that will contain all agents that meet the requirements + + // Loop through all of the agents in list and append all agents that meet the area + // and language requirement into the list agents + for(Agent a : list) { + if(a.getArea().equals(area) && a.getLanguage().equals(language)) { + agents.add(a); + } + } + + return agents; } @@ -66,7 +175,26 @@ public List getAgentsInAreaThatSpeakLanguage(String filePath, String area * @return -- The number of customers that use a certain agent in a given area. */ public short countCustomersFromAreaThatUseAgent(Map csvFilePaths, String customerArea, String agentFirstName, String agentLastName) { + short result = 0; // number of customers from specified area that use specified agent + + // Breaking the map into two separate ArrayList for iteration + List agents = readCsvFile(csvFilePaths.get("agentList"), Agent.class); + List customers = readCsvFile(csvFilePaths.get("customerList"), Customer.class); + // Iterate through customers and if the customer is in the correct area + // then iterate through agents and make sure they are the correct agent + // if they meet the requirements increment the result + for(Customer c : customers) { + if(c.getArea().equals(customerArea)) { + for (Agent a : agents) { + if(c.getAgentId() == a.getAgentId() && a.getFirstName().equals(agentFirstName) && a.getLastName().equals(a.getLastName())) { + result++; + } + } + } + } + + return result; } @@ -77,7 +205,20 @@ public short countCustomersFromAreaThatUseAgent(Map csvFilePaths, * @return -- List of customers retained for a given number of years, in ascending order of policy cost. */ public List getCustomersRetainedForYearsByPlcyCostAsc(String customerFilePath, short yearsOfService) { - + // Obtain list of customers and initialize empty list result + List customers = readCsvFile(customerFilePath, Customer.class); + List result = new ArrayList(); + + // Iterate through all of the customers and if they have retained for the + // specified number of years add them to the result list + for (Customer customer : customers) { + if(customer.getYearsOfService() >= yearsOfService) { + result.add(customer); + } + } + + Collections.sort(result); // Sort the result list + return result; // return the result } @@ -88,7 +229,19 @@ public List getCustomersRetainedForYearsByPlcyCostAsc(String customerF * @return -- List of customers who’ve made an inquiry for a policy but have not signed up. */ public List getLeadsForInsurance(String filePath) { - + // Obtain list of customers and initialize result list + List customers = readCsvFile(filePath, Customer.class); + List result = new ArrayList(); + + // For customer if they don;t have an auto policy, home policy, or + // an renters policy add current customer to the result list + for (Customer customer : customers) { + if (!customer.isAutoPolicy() && !customer.isHomePolicy() && !customer.isRentersPolicy()) { + result.add(customer); + } + } + + return result; } @@ -103,7 +256,20 @@ b. Whether that vendor is in scope of the insurance (if inScope == false, return * @return -- List of vendors within a given area, filtered by scope and vendor rating. */ public List getVendorsWithGivenRatingThatAreInScope(String filePath, String area, boolean inScope, int vendorRating) { - + // Obtain list of all vendors and initialize the result list + List vendors = readCsvFile(filePath, Vendor.class); + List result = new ArrayList(); + + // For vendor in the vendors list, if the vendor is inScope and + // the vendors rating is == to the vendorRating add current vendor + // to the result list + for (Vendor vendor : vendors) { + if (vendor.isInScope() == inScope && vendor.getVendorRating() == vendorRating) { + result.add(vendor); + } + } + + return result; //MAY NOT BE CORRECT } @@ -117,7 +283,21 @@ public List getVendorsWithGivenRatingThatAreInScope(String filePath, Str * @return -- List of customers filtered by age, number of vehicles insured and the number of dependents. */ public List getUndisclosedDrivers(String filePath, int vehiclesInsured, int dependents) { - + // List of all customers and initialize the empty array list which will + // be returned + List customers = readCsvFile(filePath, Customer.class); + List result = new ArrayList(); + + // Loop through customers and if customer has more than X vehicles insured + // and less than or equal to X dependents than add current customer to + // result list + for (Customer c : customers) { + if(c.getVehiclesInsured() > vehiclesInsured && c.getDependents().size() <= dependents) { + result.add(c); + } + } + + return result; } @@ -130,7 +310,34 @@ public List getUndisclosedDrivers(String filePath, int vehiclesInsured * @return -- Agent ID of agent with the given rank. */ public int getAgentIdGivenRank(String filePath, int agentRank) { + // List of Agents and Customers + List agents = readCsvFile(filePath, Agent.class); + List customers = readCsvFile("src/main/resources/DataFiles/customers.csv", Customer.class); + int agentId = -1; // Current agent id to be returned if actual agent not found + + // Loop through agents and customers, if customers agent is the current agent + // increment totalCustomers and add the customers rating of their agent to + // customer ratings + for(Agent agent : agents) { + int totalCustomers = 0; + int customerRatings = 0; + + for(Customer customer : customers) { + if(customer.getAgentId() == agent.getAgentId()) { + totalCustomers++; + customerRatings += customer.getAgentRating(); + } + } + // IF customer ratings / totalCustomers == agentRank + // set agentId == to the current agents ID and break; + if(customerRatings / totalCustomers == agentRank) { + agentId = agent.getAgentId(); + break; + } + } + + return agentId; // return the agentId } @@ -141,7 +348,26 @@ public int getAgentIdGivenRank(String filePath, int agentRank) { * @return -- List of customers who’ve filed a claim within the last . */ public List getCustomersWithClaims(Map csvFilePaths, short monthsOpen) { - + List customers = readCsvFile(csvFilePaths.get("customerList"), Customer.class); + List claims = readCsvFile(csvFilePaths.get("claimList"), Claim.class); + List result = new ArrayList(); + + // Loop through list of claims, if claim was opened within monthsOpen + // The loop through customers and if the claim customer ID == the + // customer customer ID add that customer to the result list. + for (Claim claim : claims) { + if (claim.getMonthsOpen() < monthsOpen) { + for (Customer customer : customers) { + if (claim.getCustomerId() == customer.getCustomerId()) { + result.add(customer); // Add customer to result list + } + } + } + } + + return result; } } + + diff --git a/src/main/java/sf/codingcompetition2020/structures/Agent.java b/src/main/java/sf/codingcompetition2020/structures/Agent.java index e2e6f93..7fe6785 100644 --- a/src/main/java/sf/codingcompetition2020/structures/Agent.java +++ b/src/main/java/sf/codingcompetition2020/structures/Agent.java @@ -1,11 +1,65 @@ package sf.codingcompetition2020.structures; public class Agent { - private int agentId; private String area; private String language; private String firstName; private String lastName; + public Agent() { + + } + + public Agent(int agentId, String area, String language, String firstName, String lastName) { + this.agentId = agentId; + this.area = area; + this.language = language; + this.firstName = firstName; + this.lastName = lastName; + } + + public int getAgentId() { + return agentId; + } + + public void setAgentId(int agentId) { + this.agentId = agentId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + + + } diff --git a/src/main/java/sf/codingcompetition2020/structures/Claim.java b/src/main/java/sf/codingcompetition2020/structures/Claim.java index 581140a..4fe0c24 100644 --- a/src/main/java/sf/codingcompetition2020/structures/Claim.java +++ b/src/main/java/sf/codingcompetition2020/structures/Claim.java @@ -6,4 +6,44 @@ public class Claim { private boolean closed; private int monthsOpen; + public Claim(int claimId, int customerId, boolean closed, int monthsOpen) { + this.claimId = claimId; + this.customerId = customerId; + this.closed = closed; + this.monthsOpen = monthsOpen; + } + + public int getClaimId() { + return claimId; + } + + public void setClaimId(int claimId) { + this.claimId = claimId; + } + + public int getCustomerId() { + return customerId; + } + + public void setCustomerId(int customerId) { + this.customerId = customerId; + } + + public boolean isClosed() { + return closed; + } + + public void setClosed(boolean closed) { + this.closed = closed; + } + + public int getMonthsOpen() { + return monthsOpen; + } + + public void setMonthsOpen(int monthsOpen) { + this.monthsOpen = monthsOpen; + } + + } diff --git a/src/main/java/sf/codingcompetition2020/structures/Customer.java b/src/main/java/sf/codingcompetition2020/structures/Customer.java index f151906..1796f50 100644 --- a/src/main/java/sf/codingcompetition2020/structures/Customer.java +++ b/src/main/java/sf/codingcompetition2020/structures/Customer.java @@ -1,27 +1,178 @@ package sf.codingcompetition2020.structures; -import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -public class Customer { +public class Customer implements Comparable{ private int customerId; private String firstName; private String lastName; private int age; + private String area; private int agentId; private short agentRating; private String primaryLanguage; + private List dependents; + private boolean homePolicy; + private boolean autoPolicy; private boolean rentersPolicy; private String totalMonthlyPremium; private short yearsOfService; private Integer vehiclesInsured; + + public Customer(int customerId, String firstName, String lastName, int age, String area, int agentId, + short agentRating, String primaryLanguage, List dependents, boolean homePolicy, + boolean autoPolicy, boolean rentersPolicy, String totalMonthlyPremium, short yearsOfService, + Integer vehiclesInsured) { + this.customerId = customerId; + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.area = area; + this.agentId = agentId; + this.agentRating = agentRating; + this.primaryLanguage = primaryLanguage; + this.dependents = dependents; + this.homePolicy = homePolicy; + this.autoPolicy = autoPolicy; + this.rentersPolicy = rentersPolicy; + this.totalMonthlyPremium = totalMonthlyPremium; + this.yearsOfService = yearsOfService; + this.vehiclesInsured = vehiclesInsured; + } + + public int getCustomerId() { + return customerId; + } + + public void setCustomerId(int customerId) { + this.customerId = customerId; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public int getAgentId() { + return agentId; + } + + public void setAgentId(int agentId) { + this.agentId = agentId; + } + + public short getAgentRating() { + return agentRating; + } + + public void setAgentRating(short agentRating) { + this.agentRating = agentRating; + } + + public String getPrimaryLanguage() { + return primaryLanguage; + } + + public void setPrimaryLanguage(String primaryLanguage) { + this.primaryLanguage = primaryLanguage; + } + + public List getDependents() { + return dependents; + } + + public void setDependents(List dependents) { + this.dependents = dependents; + } + + public boolean isHomePolicy() { + return homePolicy; + } + + public void setHomePolicy(boolean homePolicy) { + this.homePolicy = homePolicy; + } + + public boolean isAutoPolicy() { + return autoPolicy; + } + + public void setAutoPolicy(boolean autoPolicy) { + this.autoPolicy = autoPolicy; + } + + public boolean isRentersPolicy() { + return rentersPolicy; + } + + public void setRentersPolicy(boolean rentersPolicy) { + this.rentersPolicy = rentersPolicy; + } + + public String getTotalMonthlyPremium() { + return totalMonthlyPremium; + } + + public void setTotalMonthlyPremium(String totalMonthlyPremium) { + this.totalMonthlyPremium = totalMonthlyPremium; + } + + public short getYearsOfService() { + return yearsOfService; + } + + public void setYearsOfService(short yearsOfService) { + this.yearsOfService = yearsOfService; + } + + public Integer getVehiclesInsured() { + return vehiclesInsured; + } + + public void setVehiclesInsured(Integer vehiclesInsured) { + this.vehiclesInsured = vehiclesInsured; + } + + public int compareTo(Customer customer) { + return Integer.parseInt(getTotalMonthlyPremium()) - Integer.parseInt(customer.getTotalMonthlyPremium()); + } + + + } diff --git a/src/main/java/sf/codingcompetition2020/structures/Dependent.java b/src/main/java/sf/codingcompetition2020/structures/Dependent.java index d4deb1a..ada97be 100644 --- a/src/main/java/sf/codingcompetition2020/structures/Dependent.java +++ b/src/main/java/sf/codingcompetition2020/structures/Dependent.java @@ -3,5 +3,9 @@ public class Dependent { private String firstName; private String lastName; + public Dependent(String firstName,String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } } diff --git a/src/main/java/sf/codingcompetition2020/structures/Vendor.java b/src/main/java/sf/codingcompetition2020/structures/Vendor.java index 6b6fb76..b09476e 100644 --- a/src/main/java/sf/codingcompetition2020/structures/Vendor.java +++ b/src/main/java/sf/codingcompetition2020/structures/Vendor.java @@ -6,4 +6,36 @@ public class Vendor { private int vendorRating; private boolean inScope; + public Vendor(int vendorId, String area, int vendorRating, boolean inScope) { + this.vendorId = vendorId; + this.area = area; + this.vendorRating = vendorRating; + this.inScope = inScope; + } + + public int getVendorId() { + return vendorId; + } + public void setVendorId(int vendorId) { + this.vendorId = vendorId; + } + public String getArea() { + return area; + } + public void setArea(String area) { + this.area = area; + } + public int getVendorRating() { + return vendorRating; + } + public void setVendorRating(int vendorRating) { + this.vendorRating = vendorRating; + } + public boolean isInScope() { + return inScope; + } + public void setInScope(boolean inScope) { + this.inScope = inScope; + } + } diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF index e2a1a34..fa8a0de 100644 --- a/target/classes/META-INF/MANIFEST.MF +++ b/target/classes/META-INF/MANIFEST.MF @@ -1,5 +1,5 @@ Manifest-Version: 1.0 -Built-By: yc1d -Build-Jdk: 1.8.0_201 +Built-By: gabe +Build-Jdk: 14.0.2 Created-By: Maven Integration for Eclipse diff --git a/target/classes/META-INF/maven/sf.codingcompetition2020/coding-competition/pom.properties b/target/classes/META-INF/maven/sf.codingcompetition2020/coding-competition/pom.properties index fe569e3..558b363 100644 --- a/target/classes/META-INF/maven/sf.codingcompetition2020/coding-competition/pom.properties +++ b/target/classes/META-INF/maven/sf.codingcompetition2020/coding-competition/pom.properties @@ -1,7 +1,7 @@ #Generated by Maven Integration for Eclipse -#Thu Oct 08 09:27:33 MST 2020 -version=1.0.0-SNAPSHOT +#Sat Oct 10 20:11:10 CDT 2020 +m2e.projectLocation=/home/gabe/Desktop/2020/2020-StateFarm-CodingCompetitionProblem +m2e.projectName=2020-StateFarm-CodingCompetitionProblem groupId=sf.codingcompetition2020 -m2e.projectName=coding-competition -m2e.projectLocation=/Users/yc1d/Development/coding-competition/problem/online-competition artifactId=coding-competition +version=1.0.0-SNAPSHOT diff --git a/target/classes/sf/codingcompetition2020/CodingCompCsvUtil.class b/target/classes/sf/codingcompetition2020/CodingCompCsvUtil.class index 00daba9d49249e6950fa6b4b75732ac294bb504b..91ae266973758ba15f826fd757da5b9aeb044def 100644 GIT binary patch literal 10557 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 EKgGFSTmS$7 literal 3251 zcmb`JU2_{X6o!x7q;a-|mb3}wdmH)@x1~-)OG|7#6I=qGF$8KmrMXjf6YW-y&%b{C9RTh@Z3zklZt0_PBx5eR zk?aqc;f71GwYjxfu4kil9Ifl)j^W7?ED*T(oF3D1LPfW{clew|hQQe>7u?hcoY^St z6Ij3(Spa8X`8+JbSppZDT(ED_{vlIsdYCW*D@_^EWS=T-??;0RrpGmbJI(xxDg@3c zMq?DX%Psi9MsuRCWfZ1WnHs4lRO?DskUoD04wmOwf_o%RgZF8r%PRCcDhWMx=e*> zh#hp2z)er|lp7;YON}DDOJHw~(z!4Jfp9EJ4+XV*)U*bSzGz~{rL>Fn`6`z}kLKC3 zr*lG8U){6Xs5G*TrOTPw*dRr?O5o`nt;?#O(Q9bodSvTa$2O6Dru43oeOp@VWJj|s zY+_Yy`ty@-ljx)_wb{`Tf$N^eX?fO_PM)}Y-7}V!HPCGW2XnL_YoPH5Y!6*V zFPgZpYRtbObgHO`aOz$2q~poDog?gjCyh%JirQx)mP$Y6ruQX3X5tC1m7;5V8+*JV zT9F)}&PN^rvpsmw@Mu3e<*WJf8OqN}_%VU+=Uu`f-WG5bz3PaV>nM?$#g7%5rSR{1 z!;@aa=fi%kz)RrYd5?eaYI)X6mlp3cyvsT@&uc0M6kR?w0Vlgm+~;6Fe{8dI`l} z@S*?#9_?d*D;NxLei(q~*YJ+O>u>?1F5-0o-pC;L5pChYZ?N)g5d`y+cgA%#<< zz>(g9w~=RM{FCsGhj80Vcn{upT0U^31*awSkREzT>+qo?U2~*GN4oAIJ@%4r!iFQ2 z9BJYYIz8jho|kk7K60eHj#O}(e53;}sSKNrbkC6{*=>0=aWCmUJaD8>9BJaXPty-x g(nENZyZS$Q37^8Y(^7F-{@dxFy`(C7T7b{~2FpNm>;M1& diff --git a/target/classes/sf/codingcompetition2020/structures/Agent.class b/target/classes/sf/codingcompetition2020/structures/Agent.class index 26bf31f236fb6fb54997543cc9d682faad0ab137..f83eb5b492e3b5e604b31945db4b949f1d2858df 100644 GIT binary patch literal 1600 zcmbV~+fEZv6o&s@rU!=6mddG6p$bYn1%`l$7Z4I-Leiwc3k>%|8R`&d&2;LM_!wSj zVq@Zk58y)?|Fx&kW;#ubH+!wU_d0y*@cYltUjPoVpG8Wc*1L9E-7CM-ZguZIdZ8cs z-Oj=O!M@WAgMKUQ2VT#4)Al-H7KTFM#{J|vw{EBHyt};dTA@PLmEXpdf@&xjZs55J z#pcNHJPa8ANFgVFeVQxGUi(2WJag};^Z8!Q9Qz$VJW-gb)-D+AZTHGEF@u5y3y&1? zO~2!v_3tjd;Jtf!OXp&<+j4I&+`yOn@X-iA_&tSs^Ph_&U9;Mlg#N#m+QlpsmMx@_ z5v^n)i=1d{7G@*usRc9AHZ05`r(m|dPk&=#3OG!VpWH+>AFSKMQC@p$$;5;Amc1Wox)AkSKziG31o+iV{Y0$JtO`Igj z6D&|lfJL4X;4>{HZAAjuYXdCVI|HoPy92D+C1ZfHT}ltIK8n3gK+xAfo&zgTn`hi2 zN<23hU-F$qF^BmWT^A<|6j+Dc)dO&52&}M$7sFWNAS+*EARCDwFR?uV zQfGVPAe&6LH3dZ0K{`-P1X+!PY$t-$l0jDEAa#Q5OaYN`35cBtQjUW-i6Hf4ka8U4 rkRY$7fXKE8$W9{2dK~0+BFJts$k?JsJ90#j<0&ArtOBy9m%;f9Fv;Ct delta 80 zcmX@Wvxb@L)W2Q(7#J7~8N@eo@iR`2V)E8uWME|AVc-Rld_Wm}Ak7G*S+%w^@NWb% Wm>2|sBpXYuG7{~tuTPWM5Eh1ECsn)&-+t_WYH%%`jCM0MN8V=l+Wu()SS4aU+$9y=Dcuq%*ncLpU0Jg~5V z0$UF)6qi=r!X`@Wdt|{xL13q^eEDuZ8_Dp4JDN(W>j$1Y9k`+5bK*4OTNMeM_y2qD zSA;&1vDScxA}pRWO1X@-o}kQWsqxF4lR9szsGA5vO-PcGZnBifXb)Kh?(sGy6!%D< z&G*4P^yC}G6Pg<8g5Ly3q(z<{)7As~I|)TQtF{G;)-s(w>wKVTf5*1H zzd*%4SfFaR7O2@ZV}ZS|y0$@UGpRR7@)GsfrY=?L(jcoz@t1TnXYJ#FcD9&AXp32L z+F}|eZSunruRsfj35`QL=Wp2GQ29bej+!HBQqh+%I3*;P2t3Akjp0)?ds*f+ z;w(#%+A7E?ft;-Y;YVVSXPJuZt%7tiLE71hq<+-$X`U0v#TpR)BMj2fpTYhEIJTb? delta 120 zcmdnb*~`pz>ff$?3=9m03}O?xT1A;PG{YDfSe)}yQn?tI8Tfe^xEXjRUW=c6fYHf= zk%1A!1(Li#9r{3;5lFLYZD-)y2xKrZ2mnboupl#oAdn4G3RJ)##2^f$85u-?Bol)u E02n|Hxc~qF diff --git a/target/classes/sf/codingcompetition2020/structures/Customer.class b/target/classes/sf/codingcompetition2020/structures/Customer.class index 844ea29474f5bc9dd328dee078d97b0567ad1de8..146aff93df3e9af8d0da7f499a53c0e8e951f9d3 100644 GIT binary patch literal 4987 zcmcJR+ix316vodcj-5E0dmRXc0=?Rsrfzy64M{H{q152EX`O~P1nAb;CR-dktk{f{{8bW zB05Z;#Hhuf{pIWFd}+xoF6T?DYmV>wZmD?a;Gu)*vhP*$e#LXj>FG+@FReOWj3Ng0 z-mus0bipnzr_W!z;pF`oMGe|k^G+j??b+7~jzRH!&^5DUkdZN{=*;3vv%-f#J&w(@Iuedl02Oeo}hvyx8Yw+P@ z8*5?0u4Ts$pfMmXMG<%hkIWQKQxiQv<8f`;J1`VAY#^29s%ZpAe=S2AccxwRvh%EX}x@0e7evvJy>_hR&}L4CEG zGZ@IETl7AzPmEJ`;4?^jesD(H!#i0Ck+=DT9Po}wK2>m!HPRT{Ap(JG~_M661q)=+zu4qHPVRXS=V;#C^65}j2V zw-RQRCaj^ZDjl~H-Bmhi4fRxM>KEj1rD^=0#+5;!h|o?{VHYly-I&uJTo8Lfwhva4 zhABm(WYHL`sQ)yA4ZEPQdBsPh)K%MZNVfBdYN7cI-fu^PcbSM zjY}+h%ZVSu1jj{&K^e7Krf5(mgR*os$W;%r@8``_5@b>fat`YuXHf$g#>P=WP61@9 z2?(zeS725Pl2Sotv>+GsASo5(3_vnXKzNfd$VKha4693%)q>>oOEav3%mU;>6A<2` z3^J#!$cS2zIW5Q~eMLr8kjntM(gcK$2!qUPE0R_#vZw`lRbP>`3UU=7b`uajp$u{v zsEwy)R0Ubmf-FEZ)XfU18&yG80OB?QVS!+fMeWiYR+pxr1$kY+G>27?HGsU`1cdd8 zLEfM@akQnDUv1EnqbiWE1+wYdW|F)}GK*)aD>%+a8B9vI)Rmh6+h_tNucw;iMIoRG zfx1KvT2=DK)Wy4{MZ8YSLFby%VDZM(n%xH4ohE3k-(0g5Ey%bEa#suD>Osa;kb406 zv%Y^@Vc9IH#kpUXv3K*v@1+m$iDdLn kA>)TZ##E58!y5jZj0bdEO=XBwECem|k@)>M(3-pd0miIz6951J delta 260 zcmXYp$q52M6hvRoIHR`vzVEviF$OONAV#2`1kJ!0WODF6C&7bvO-T?xZS$e3Uh%2V z_~z^P_wfXlOs;wz9?vT4PG?(1WOdr@H7?!Y=Y@PT((}ZUbX)ff$?3=9m$3=-@NOpFY=6EEscwDk>E*YL?oEKAhSNz6;v4=yRn%uBb% z6wwT0WMFa5Pf6usU}oUqVc=lkWn^I1& zRLQ`=ueF_lTT6Q@1D}@8RtABMKp`duAs{Klzyc)MfFwHuC(t}TASnzKQGjS;5MdAn Z@_+__%mx|_Vgbzt>SkmR1M-*{!~v#hAjbdz delta 102 zcmaFC+`!Cr>ff$?3=9m048jw+8bp~jG{YDfSe)}yQn?tI8F+XYI2br5-d%2`&%g+T p3=FJV+Znhw0vSvUyg-r-EXd5j2W0a=6fp2J2mpDE41!=)LICNc4J`lw diff --git a/target/classes/sf/codingcompetition2020/structures/Vendor.class b/target/classes/sf/codingcompetition2020/structures/Vendor.class index fdbca9b6e0183e880547b8ff174552c31967ec4f..02793b784476f522adc2e0820bb7c87681f7efa4 100644 GIT binary patch literal 1297 zcma))-)<5?6vn@SEtF-ImI9?9+FEUwEq0sgou-K~F(DzEh~c7l%d+A&bhp`EdhG*w zp^3!A3m?FTGM+QL{0Y#+o0&5+-#ODW#);g> z^}X}6^D{Gyg0UTq11B_ljyLdwEEIvQE9=%WN0v7<-}kQ^I}+HumB;OYfM^RSR^V6y z#m-#WjRI=$Qb3EPAFPPh0$JDV+Ww70iI)PISFYzq7Xnqiy_(#Xp7U;e-FJeIR)0i|iyhy#Mm;NV zd7W%3(PuXlXm$SI9J*Y7=tQwoYz2Xl8ToK=Ptn_ai7W|UOOr}^bM>YqpsZL>)>qHD zL}Auz>SbZpX}Xhh!}io)q9KP>(#*CLT{^0E{c&JBZ(VjHAM>B`)8T+DOw(6UkYaBs zO0lzYCST=DuF}kAYq&?_eOi5ydZ1?fM8T*}P&8T-l#Ip%6{D<7Q2j1*Yc$qmogDR0 zsY;&mHSAEOJ&Njd{(?HQ>H!)wbHpSuk3z8-R`||31l?zgHi;TR+99xyUC4wo-3YAzj!^|X@0*`UH2Bh?D31oLI z$P+wGlII{NWaTmlyHdXcgk53>j@CL-S$3qc7UX!nBb8;4eF8bS1B4%mL3A`}WOo;z mrn(GrxE92~Ns>Hwgnrnh(M0-0O3EvAT9X@&;9|XmbwN2 delta 120 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 literal 3972 zcmcguYjYD-7=BJ~Nz)~5)3n@F76h6`Xxc&r3Zf;Y7znpsg5{!aH>b_Eo87v*2~*U; zK~esVxqkafPc6 z!yaXs8_u+*^IM8jVo2m0duAPr;Lp>htZCSeVmJjwuka{383t`j&6E|*$XMJqE0)Ub z%#`9N0?E#}p!Tq8S4mmb6|Edth(damvb*0`?olhYW0twq(C=nQ?`S+w@gd?>ZWPTX zfCNKoM*vU3SMPMslGkh}iav%;mz^i}Gf06kZ)Pt;uNM^0{RQEEh7$zM351F+;tAcFpNXO;FyH{IKa@I*9?B6QeNcNoU*8MkvgWT=mo{ngzQhYIVH_z z7`$YdN!0A$Mh5wFpSFyOF|| zEz7i`_<-T>c|&BXUgbquRE(y(Ao7}J5^C9=kYk;5B`%k_Q!n>H>qd8YnoY^(5 ztmdg@Rj3f7m}mIwwIk_bz9Jm%o~_~d9~2pms3I^yOzmmQEN3-m-J!$J+uWrP#U~7R zcRsgB;K2(Q2W4}OTZ%(DN=Zw#A}hLXKJ?SpYt^#Ot6Y~CIW5Se!)Ia)L*)88g&FQp zXXnLf(^}w)WnWsqrK{^%({?6pHHv$T{kSuikZKCRUlE32+tx_9JZ>({a;vJTJ6Gg( z5OdTw^y{YKl=Ssm7B6d+^3DYsRM{K#h3#16m0dKI?Udj62nLtgP$=sL@YtL}UkRPYFj3~{&H)>kAfVVN#1TYE%z0^MLa z>Lz5n;NHUa9nC3S(ddSqq4sMmiwdWPlrv^kO51==R}^$>dTnW3P%|WyU^1Kyq4siH zx|@56Zh+hp45TP3fr(Re6Ye_w#{z_ILF|!)FYy&MU(%m9ikhwJrp=2}79G)|c6U64 zaBh2g@uqg2EBbyiRs)l*!sNFS9^*TPfiP&{?StYhn_7x+x_jLaqu8wbS`+Unh6AB* z#bFUq9Hz^@mF|cr65_EzQiP-ySEeUNUGAcFdU(|3ILY+}1VqXm>(l0Q)@EjvGjQ&L0EjUHrG(DPtZnUA7MuKl229P9M{WwCS6fqhm z4(DjkY1%1ymNAa^Nn$udJ6mv;#)9`b`WFmO`wU|*FtL!h@EjNapjpqN*asYHLW|YW zCPUHgkk^IIu_P{~f5vDcnwZ+a^wVFEOX8+KbK9S394+n!ZIBL?!ch!089Y`uI2&qk zGyS;``Xfzf4f=&$pxp^UJ0FU+unV-iA!t`a(e8($O;O;5YX_2e;5stCfzN)$B7^X5 z!6Ivt3zbBu!;D`SJu06wI