Organizing array list of objects JAVA - java
I'm having troubling organizing my list of employees. I just need to organize them according to their employee type (first two letters). Each object starts with the employee code which are the first two letters. This is what I need to separate the position types but for some reason I can't grab them.
Here is the file that I am creating the objects out of and storing them in the arrays.
PW_1234,James,Bond,01/02/10,1,10 PW_1235,John,Brown,02/03/10,2,10.5
PW_1236,Howard,Johnson,03/04/10,3,11
PW_1237,Francis,Themule,04/05/11,4,10.75
PW_1238,Mathew,Lewis,05/06/11,1,12.75
PW_1239,Mark,Bixton,05/13/11,2,13
PW_1242,Sarah,Glover,05/14/11,1,13.75 PW_1245,John,Doe,05/15/11,4,10.5
PW_1245,Mary,Doe,05/15/11,4,10.5
TL_1248,Abel,English,05/16/11,3,16.5,0.01,100,89
TL_1251,Eustis,Clauser,05/17/11,2,16,0.02,100,9
SU_1254,Henry,Hollowman,05/18/11,1,40000,0.01
PW_1240,Luke,Sailor,01/22/12,3,14.5 PW_1243,Jane,Baker,01/23/12,2,14
PW_1243,Jane,Baker,01/23/12,2,14
TL_1246,David,Brief,01/24/12,1,14.75,0.01,100,57
PW_1246,David,Doson,01/24/12,1,14.75
TL_1249,Baker,Anderson,01/25/12,4,11.5,0.01,100,100
TL_1252,Frank,Donson,01/26/12,3,17.5,0.02,100,39
SU_1255,Issac,Asimov,01/27/12,2,43000,0.02
SU_1256,Issac,Shoreman,01/28/12,3,39000,0.01
SU_1257,Issac,Roberts,01/29/12,4,35500,0.01
PW_1241,John,Candy,11/23/13,4,9.5 PW_1244,Kate,Smith,11/24/13,3,15.5
PW_1244,Kate,Handle,11/24/13,3,15.5
TL_1247,Samual,Dempky,11/25/13,2,15,0.01,100,10
TL_1250,Charley,Boman,11/26/13,1,15.75,0.01,100,50
TL_1253,George,Fritzmen,11/27/13,4,12.5,0.02,100,27
Here is the code:
private String makeEmployeeList()
{
String list = "";
for(int i=0; i < employees.length; i++)
{
list += "\n"+employees[i].toString();
if(employees[i]substring(0,2).equals("SU"))
{
list += "\n"+employees[i].toString();
}
}
return list;
}
**Here is how the employees array is created:
private Employee[] employees;
**Here is how everything is loaded into it.
public void loadEmployeesFromFile(String fileName)
{
File inFile = new File(fileName);
if(inFile.exists()) // MAKE SURE FILE EXISTS
{
try
{
BufferedReader inReader = new BufferedReader(new FileReader(inFile));
inReader.mark(32000);
String inLine = inReader.readLine();
//************************************
// Counting rows to set array size
//************************************
int rowCount = 0;
while (inLine != null && !inLine.equals(""))
{
rowCount++;
inLine = inReader.readLine();
}
inReader.reset();
//*******************
// re-reading data
//*******************
this.employees = new Employee[rowCount];
for(int rowIndex = 0;rowIndex < rowCount; rowIndex++)
{
inLine = inReader.readLine();
Scanner employeeScanner = new Scanner(inLine).useDelimiter(",");
String workerType = employeeScanner.next();
String firstName = employeeScanner.next();
String lastName = employeeScanner.next();
String hireDate = employeeScanner.next();
int shift = employeeScanner.nextInt();
if(workerType.substring(0,2).equals("PW"))
{
double pay = employeeScanner.nextDouble();
employees[rowIndex]= new ProductionWorker(workerType, firstName, lastName, hireDate, shift, pay);
}
else if(workerType.substring(0,2).equals("TL"))
{
double pay = employeeScanner.nextDouble();
double bonusRate = employeeScanner.nextDouble();
int reqHours = employeeScanner.nextInt();
int recHours = employeeScanner.nextInt();
employees[rowIndex]= new TeamLeader(workerType, firstName, lastName, hireDate, shift, pay, bonusRate, reqHours, recHours);
}
else if(workerType.substring(0,2).equals("SU"))
{
double salary = employeeScanner.nextDouble();
double bonusRate = employeeScanner.nextDouble();
employees[rowIndex]= new ShiftSupervisor(workerType, firstName, lastName, hireDate, shift, salary, bonusRate );
}
}
return;
}catch(IOException ioe)
{
System.err.print("\nTrouble reading employee file: "+fileName);
}
}
JOptionPane.showMessageDialog(null, "\nFile Name does not exist!\n Process terminating!");
System.exit(0);
}
private String makeEmployeeList(){
StringBuilder sbSU = null;
for(int i=0; i < employees.length; i++)
{
sbSU = new StringBuilder();
if(employees[i].substring(0,2).equals("SU"))
{
sbSU.append(employees[i].toString());
}
}
return sbSU.toString();
}
First of all, you missed a dot after emplyees[i] subsrting
As string is an immutable object, I suggest you use StringBuilder and its append method instead of +=. and use its toString() method to convert StringBuilder to a String. You also need to override your Employees's toString method.
to sort the employees in an array, you need to implements Comparable or Comparator interface so that the Array knows which criteria to use when sorting your employees, in your case it is to compare the employee's type
As you are using JOptionPane you can use html inside to give it format. Make an Employee class and make it's natural order by type, or you can use a Comparator if you don't want to use Comparable
I made a complete example for you.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JOptionPane;
public class Employee implements Comparable<Employee> {
private String type;
private String name;
public Employee(String type, String name) {
super();
this.type = type;
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
#Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
#Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
return true;
}
public int compareTo(Employee o) {
if (this.type.equals(o.type)) {
return name.compareTo(o.name);
}
return type.compareTo(o.type);
}
public static void main(String[] args) {
List<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee("CA","John"));
employees.add(new Employee("CA", "Suzy"));
employees.add(new Employee("TA","Malcom"));
employees.add(new Employee("AA","Rose"));
// Sort the list by type as its natural order or use proper Comparator
Collections.sort(employees);
StringBuilder sb = new StringBuilder();
sb.append("<html><table><tr><td>Type</td><td>Name</td></tr>");
for (Employee e : employees) {
sb.append("<tr>");
sb.append("<td> ").append(e.getType()).append("</td>");
sb.append("<td> ").append(e.getName()).append("</td>");
sb.append("</tr>");
}
sb.append("</table></html>");
JOptionPane.showMessageDialog(null, sb);
}
}
Output:
Related
How to get name from a list of employees
I am trying to print "name" of an employee from a list of employees. Below is my pojo class. import java.time.LocalDate; public class Employee { private String name; private String empID; private Designation designation; private LocalDate dateOfJoining; private int monthlySalary; public Employee(String name, String empID, Designation designation, LocalDate dateOfJoining, int monthlySalary) { super(); this.name = name; this.empID = empID; this.designation = designation; this.dateOfJoining = dateOfJoining; this.monthlySalary = monthlySalary; } public Employee() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmpID() { return empID; } public void setEmpID(String empID) { this.empID = empID; } public Designation getDesignation() { return designation; } public void setDesignation(Designation designation) { this.designation = designation; } public LocalDate getDOJ() { return dateOfJoining; } public void setDOJ(LocalDate dOJ) { dateOfJoining = dOJ; } public int getMonthlySalary() { return monthlySalary; } public void setMonthlySalary(int monthlySalary) { this.monthlySalary = monthlySalary; } #Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((dateOfJoining == null) ? 0 : dateOfJoining.hashCode()); result = prime * result + ((designation == null) ? 0 : designation.hashCode()); result = prime * result + ((empID == null) ? 0 : empID.hashCode()); result = prime * result + monthlySalary; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } #Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Employee other = (Employee) obj; if (dateOfJoining == null) { if (other.dateOfJoining != null) return false; } else if (!dateOfJoining.equals(other.dateOfJoining)) return false; if (designation == null) { if (other.designation != null) return false; } else if (!designation.equals(other.designation)) return false; if (empID == null) { if (other.empID != null) return false; } else if (!empID.equals(other.empID)) return false; if (monthlySalary != other.monthlySalary) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } #Override public String toString() { return "Employee [name=" + name + ", empID=" + empID + ", designation=" + designation + ", DOJ=" + dateOfJoining + ", monthlySalary=" + monthlySalary + "]"; } } Now while I am trying to print the "name", I am getting null value. Please see as below, import java.time.LocalDate; import java.time.Period; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Employecomparable { public static void main(String[] args) { JoiningDate jd = new JoiningDate(); Employee emp = new Employee(); List<Employee> listofemployee = new ArrayList<>(); listofemployee.add(new Employee("abc", "12345", Designation.ASE,jd.date1 , 20000)); listofemployee.add(new Employee("abcd", "24680", Designation.SE, jd.date2, 30000)); listofemployee.add(new Employee("abcde", "13570", Designation.SSE,jd.date3, 40000)); listofemployee.add(new Employee("abcdef", "13690", Designation.TL, jd.date4, 60000)); listofemployee.add(new Employee("xyz", "10909", Designation.AM, jd.date5, 800000)); listofemployee.add(new Employee("koool", "89076", Designation.M, jd.date6, 2000)); System.out.println("The name of employee is "+emp.getName()); I am getting the output as "null". In console I get, The name of employee is null. How do i print the name? Please help!
To print the name of a particular employee, kindly update the emp object. emp = listofemployee.get(indexWithinTheList); System.out.println("The name of employee is "+emp.getName()); Example: emp = listofemployee.get(0); System.out.println("The name of employee is "+emp.getName()); Output : The name of employee is abc
You may want to iterate over your employee and then print the name. Reason you get null is you created Employee object with default constructor. Which would mean name being string object would take default null value which is what you see. If you want to print employee names, you could do the following: for (Employee employee: listofemployee) { System.out.println("The name of employee is " + employee.getName()); } Since you are using List interface, you can access individual object by it's index. E.g. to get first employee name: System.out.println("The name of employee is " + listofemployee.get(0).getName());
The error you are getting is because you have created the Employee object like below. Employee emp = new Employee(); After that you are populating the list using new Employee. But you have not set any value to variable emp.so getName from emp will return null. If you want to get the value from emp. You first need to set the name using emp.SetName("Any name"); No you will get the value using emp.getName();
1 - Create Employee object like below:- Employee emp =new Employee("xyz", "10909", Designation.AM, jd.date5, 800000); 2 - Then store into list. 3 - After that iterate over list and print result as per your requirement. public static void main(String[] args) { JoiningDate jd = new JoiningDate(); Employee emp = new Employee(); List<Employee> listofemployee = new ArrayList<>(); emp = new Employee("abc", "12345", Designation.ASE,jd.date1 , 20000); listofemployee.add(emp); emp =new Employee("abcd", "24680", Designation.SE, jd.date2, 30000); listofemployee.add(emp); emp =new Employee("abcde", "13570", Designation.SSE,jd.date3, 40000); listofemployee.add(emp); emp = new Employee("abcdef", "13690", Designation.TL, jd.date4, 60000); listofemployee.add(emp); emp =new Employee("koool", "89076", Designation.M, jd.date6, 2000); listofemployee.add(emp); emp =new Employee("xyz", "10909", Designation.AM, jd.date5, 800000); listofemployee.add(emp); System.out.println("The name of employee is "+emp.getName()); Iterator<Employee> itr = listofemployee.iterator(); // checking the next element availabilty while (itr.hasNext()) { System.out.println("name " + (itr.next()).getName()); } }
Java - Returning an "address" from an ArrayList of names and addresses
I've been working on this AP Problem all day with no luck. If anyone can help, it would be appreciated. I have an ArrayList of Strings composed of names and addresses. After the addresses, there is an empty String and the next name starts. The method getAddress takes a String parameter (a name) and returns the address of the pereson (the lines after the name including the empty String, but stopping there). I'm having trouble writing this method. import java.util.ArrayList; public class Recipients { ArrayList<String> lines = new ArrayList<String>(); public String extractCity(String cityZip) { int pos = cityZip.indexOf(","); return cityZip.substring(0, pos); } public void printNames() { System.out.println(lines.get(0)); for (int i = 0; i < lines.size()-1; i++) if (lines.get(i).substring(0, lines.get(i).length()).equals("")) System.out.println(lines.get(i+1)); } public String getAddress(String name) { String address = ""; int ct = 0; int place = 0; for (int i = 0; i < lines.size(); i++) { if (lines.get(i).substring(0, lines.get(i).length()).equals(name)) { place = i; for (int j = i+1; j < lines.size(); j++) { ct = j; if (!lines.get(i).substring(0, lines.get(i).length()).equals("")) { ct++; } } for (int k = place; k < ct; k++) { address = address + lines.get(i); } } } return address; } public void main() { lines.add("Mr. J Adams"); lines.add("Rose St."); lines.add("Ithaca, NY 14850"); lines.add(""); lines.add("Jack S. Smith"); lines.add("12 Posy Way"); lines.add("Suite #201"); lines.add("Glendale, CA 91203"); lines.add(""); lines.add("Ms. M.K. Delgado"); lines.add("2 River Dr."); lines.add(""); System.out.println(getAddress("Jack S. Smith")); System.out.println("test line break"); } } Thank you for your time. EDIT: This method is supposed to be written in the Recipients class. It has an assumed constructor and I've written other methods inside the class. I've edited the class. I'm having trouble with the logic. Worksheet says: Write the getAddress method of the Recipients class. This method should return a string that contains only the address of the corresponding name parameter. For example, if name is "Jack S. Smith", a string containing the three subsequent lines of his address should be returned. This string should contain line breaks in appropriate places, including after the last line of the address. public String getAddress(String name)
You should create class for saving name and address. Please find below mentioned approach. package hello; import java.util.ArrayList; import java.util.List; class Employee { private String name; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } public class So3 { public static void main(String[] args) { List<String> lines = new ArrayList<String>(); lines.add("Mr. J Adams"); lines.add("Rose St."); lines.add("Ithaca, NY 14850"); lines.add(""); lines.add("Jack S. Smith"); lines.add("12 Posy Way"); lines.add("Suite #201"); lines.add("Glendale, CA 91203"); lines.add(""); lines.add("Ms. M.K. Delgado"); lines.add("2 River Dr."); lines.add(""); List<Employee> employees = new ArrayList<Employee>(); Employee employee = new Employee(); for (String str : lines) { if (str.isEmpty()) { if (employee.getName() != null && employee.getAddress() != null) { employees.add(employee); employee = new Employee(); } } else if (employee.getName() == null) { employee.setName(str); } else { if (employee.getAddress() == null) { employee.setAddress(str); } else { employee.setAddress(employee.getAddress() + " " + str); } } } if (employee.getName() != null && employee.getAddress() != null) { employees.add(employee); } System.out.println(getAddress(employees, "Ms. M.K. Delgado")); } private static String getAddress(List<Employee> employees, String name) { if (employees != null && name != null) { for (Employee employee : employees) { if (name.equals(employee.getName())) { return employee.getAddress(); } } } return null; } }
If you have to use as you have wanted then you need to modify your getAddress method. Try the following getAddress method in your code: public String getAddress(String name) { String address = ""; boolean nameFound=false; for(String str:lines) { if(!nameFound && str.equals(name)) nameFound=true; else if(nameFound && str.isEmpty()) break; else if(nameFound && !str.isEmpty()) address+=str; } return address; }
You should use HashMap rather than an ArrayList for this. This is a perfect scenario to use HashMap instead. public class APProblem { Map<String, List<String>> lines2 = new HashMap<>(); public List<String> getAddress(String name) { return lines2.get(name); } public void main() { String name = "Mr. J Adams"; List<String> address = Arrays.asList("Rose St.", "Ithaca, NY 14850"); lines2.put(name, address); name = "Jack S. Smith"; address = Arrays.asList("12 Posy Way", "Suite #201", "Glendale, CA 91203"); lines2.put(name, address); System.out.println(getAddress("Jack S. Smith")); System.out.println("Testing line break."); } }
Can't add nodes in my linked list (java)
I've been working on my add method for a couple of hours now and seem to have hit a roadblock. My method is supposed to search through every node in the list to see if there is a matching employee number and if there isn't, add the object in order of employee number. Unfortunately I cant even seem to add a node to the beginning or end of my list. I think I understand the logic. I have to search through my list for find where I want the node, then all I have to do is have the new node's link point the already existing one. I think that I'm either not creating the nodes properly or not linking them properly. Every time I try to test my code though, only one node appears in my list. import java.util.*; public class HumanResources { private EmployeeNode first; employee data = new employee(); private class EmployeeNode { //data members of employeenode private EmployeeNode link; employee data = new employee(); private EmployeeNode() { data = null; link = null; } private EmployeeNode (employee emp) { data = emp; link = null; } } public EmployeeNode search (employee search) { EmployeeNode current = first; if (first == null) { return null;} while((present != null) && (present.data != search)) { present = present.link; } return present; } private EmployeeNode nextInList(EmployeeNode x) { return x.link; } public boolean isEmpty() { return ( first == null ); } // end of isEmpty() public HumanResources() { first = null; } public HumanResources ( employee x) { this.data = x; } public boolean addEmployee( employee emp) { EmployeeNode current = new EmployeeNode(); current = first; if (current == null) { first = new EmployeeNode(emp); return true; } else { while(current.link != null) { EmployeeNode temp = new EmployeeNode(); temp.data = emp; temp.link = current; } return true; } } public Employee findEmployee(String EmpNumber) { EmployeeNode current = first; if(first == null) { return null; } else{ while (current != null) { public String toString() { EmployeeNode display; display = first; String temp = ""; while(display != null) { temp += display.data + "\n"; display = display.link; } return temp; } } And here is my employee class import java.util.*; /** This class manipulate information relating to employees */ public class employee { private String empNumber; private String name; private String department; private double salary; /** Zero parameter constructor that sets the values to null */ public employee() { empNumber = null; name = null; department = null; salary = 0.0; } /** Four parameter constructor to initialize the data members to the give values #param kempnumber Employee's ID number #param kname Employee's name #param kdepartment Employee's department name #param ksalary Employee's salary */ public employee(String kempnumber, String kname, String kdepartment, double ksalary) { empNumber = kempnumber; department=kdepartment ; name = kname; salary = ksalary; } /** copy constructor */ public employee (employee copy) { empNumber = copy.empNumber; name = copy.name; department = copy.department; salary = copy.salary; } /** Four parameter constructor to set data members to given value #param kname Employee's name #param kdepartment Employee's department name #param ksalary Employee's salary */ public void setEmployee(String kempnumber, String kname, String kdepartment, double ksalary) { empNumber = kempnumber; department=kdepartment ; name = kname; salary = ksalary; } public String getEmpNumber() { return empNumber; } public void setEmpNumber(String empNumber) { this.empNumber = empNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public String toString() { return (empNumber + " " + name + " " + department + " " +salary); } public boolean equals(employee compareto) { int firstemployee = Integer.parseInt(empNumber); int secondemployee = Integer.parseInt(compareto.empNumber); if (firstemployee == secondemployee) { return true; } else { return false; } } public int compareTo(employee compareto) { int less = -1; int same = 0; int more = 1; int firstemployee = Integer.parseInt(empNumber); int secondemployee = Integer.parseInt(compareto.empNumber); if(firstemployee > secondemployee) { return more; } else if(firstemployee == secondemployee) { return same; } else { return less; } } }
For the addEmployee method, if you are adding to the front of the list you shouldn't need a while loop at all. Your 'first' variable is presumably maintaining a reference to the front of the loop, so all you need to do is create the employee, update the links and point 'first' towards it. Something like this... public boolean addEmployee( employee emp){ if (first == null) { first = new EmployeeNode(emp); return true; } else { // first must != null EmployeeNode temp = new EmployeeNode(emp); //create the new employee temp.link = first; // link the new employee to the old employee at the front of the list first = temp; //update the new front of list to be the new employee return true; } } Keep in mind though if you want to add it to the end of the list, you will need a while loop to search through the list and find the end before creating the new employee and updating the links. If your getting confused with the links, try stepping through the code and drawing out the nodes with lines to represent the links to help get you used to visualising the linked list.
1.how to read data row by row in csv file.and how to validate a particular row in csv
for example s_id,name,age: 2,avian,30: So I want to validate the age. It means age should be between 15 to 60. And it should be integer always. It can not be float or anything else... public class Customer { private String customerId; private String companyName; // ... public static Customer create(final String... args) { if (args.length != 15) { return null; // or throw an exception } final Customer rv = new Customer(); rv.setCustomerId(args[0]); rv.setCompanyName(args[1]); // ... return rv; } public String getCustomerId() { return customerId; } public void setCustomerId(final String customerId) { this.customerId = customerId; } public String getCompanyName() { return companyName; } public void setCompanyName(final String companyName) { this.companyName = companyName; } }
ad 1) How to read data row by row in csv file Customer c1 = new Customer(); try { InputStream ips = new FileInputStream("input.txt"); InputStreamReader ipsr = new InputStreamReader(ips); BufferedReader br = new BufferedReader(ipsr); String line; while ((line = br.readLine()) != null) { String[] s = line.split(","); c1.setCustomerId(s[0]); c1.setCompanyName(s[1]); } br.close(); } catch (Exception e) { e.printStackTrace(); } ad 2) how to validate a paricular row in csv public void setCustomerId(final String customerId) throws IllegalArgumentException { if (customerId != null && customerId != "") { int temp = Integer.parseInt(customerId); if (temp < 15 || temp > 60) { throw new IllegalArgumentException("Invalid age"); } } this.customerId = customerId; }
You can use CSV reader for reading any .csv files. There are some methods that fetches you directly a row in the CSV file. or you can directly use java IO streams to read the CSV file. for example, BufferedReader br = new BufferedReader(new FileReader(csvFile)); while ((line = br.readLine()) != null) { // use comma as separator String[] emp = line.split(","); System.out.println("S_Id" + emp[0] + " , name=" + emp[1] + ", age="+emp[2]); // You can validate your age here..... }
her is an example to read from a .csv file using Commons CSV Api Fist I will but customer class and customer.csv to help you to execute the main class public class Customer { private String id; private String name; private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } #Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } #Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Customer other = (Customer) obj; if (age != other.age) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } #Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Customer [id="); builder.append(id); builder.append(", name="); builder.append(name); builder.append(", age="); builder.append(age); builder.append("]"); return builder.toString(); } } customer.csv that I use in ApacheCommonsCSVParser class s_id,name,age 1,customer1,30 2,customer2,31 3,customer3,25 4,customer4,15 5,customer5,14 And finally the ApacheCommonsCSVParser.java(main class) import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; public class ApacheCommonsCSVParser { public static void main(String[] args) throws FileNotFoundException, IOException { //Create the CSVFormat object CSVFormat format = CSVFormat.RFC4180.withHeader().withDelimiter(','); //initialize the CSVParser object CSVParser parser = new CSVParser(new FileReader("customer.csv"), format); List<Customer> emps = new ArrayList<Customer>(); for(CSVRecord record : parser){ Customer emp = new Customer(); emp.setId(record.get("s_id")); emp.setName(record.get("name")); emp.setAge(Integer.parseInt(record.get("age"))); if(emp.getAge()>=15){ emps.add(emp); } } //close the parser parser.close(); System.out.println(emps); } }
remove duplicate object in Java
I've User object a shown below: User.java: public class User { public String firstName; public String lastName; 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; } #Override public int hashCode() { return (this.firstName.hashCode() + this.lastName.hashCode()); } #Override public boolean equals(Object obj) { if(obj instanceof User) { User temp = (User) obj; if(this.firstName.equals(temp.firstName) && this.lastName.equals(temp.lastName)) { return true; } } return false; } } And main program is shown below: import java.util.*; class pp { public static void main(String[] args) { List<User[]> a = new ArrayList<User[]>(); User[] u = new User[3]; u[0] = new User(); u[0].setFirstName("Mike"); u[0].setLastName("Jordon"); u[1] = new User(); u[1].setFirstName("Jack"); u[1].setLastName("Nicolson"); u[2] = new User(); u[2].setFirstName("Jack"); u[2].setLastName("Nicolson"); a.add(u); Set<User[]> s = new HashSet<User[]>(a); for (User[] ss : s) { for (int i=0; i<ss.length; i++) { System.out.println(ss[i].getFirstName() + " " + ss[i].getLastName()); } } } } I'm expecting output to be Mike Jordon Jack Nicolson But somehow, its retaining duplicate object & printing as: Mike Jordon Jack Nicolson Jack Nicolson Can any one tell me what I'm missing?? Thanks!
Your equals method should be like : #Override public boolean equals(Object obj) { if(obj instanceof User) { User temp = (User) obj; if(this.firstName.equals(temp.firstName) && this.lastName.equals(temp.lastName)) { return true; } } return false; }
I have gone through your questions and understood the requirement. Please find the similar kind of code I have implemented and also successfully removed objects from a collection those having duplicate values. #Snipet... Employee.java ============== package com.hcl; public class Employee { public String empid; public String empname; public double sal; public int age; public Employee(){ } public Employee(String empid,String empname,double sal,int age){ this.empid = empid; this.empname = empname; this.sal = sal; this.age = age; } public String getEmpid() { return empid; } public void setEmpid(String empid) { this.empid = empid; } public String getEmpname() { return empname; } public void setEmpname(String empname) { this.empname = empname; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * This override method playes a major role to remove duplicate values */ #Override public int hashCode() { return (this.empid.hashCode() + this.empname.hashCode()+String.valueOf(this.sal).hashCode()+String.valueOf(this.age).hashCode()); } /** * This override method plays a major role to remove duplicate values */ #Override public boolean equals(Object obj) { if(obj instanceof Employee) { Employee temp = (Employee) obj; if(this.empid.equals(temp.empid) && this.empname.equals(temp.empname) && String.valueOf(this.sal).equals(String.valueOf(temp.sal)) && String.valueOf(this.age).equals(String.valueOf(temp.age))) { return true; } } return false; } } #Snipet.......... RemoveDuplicateObjects.java ============================= package com.hcl; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class RemoveDuplicateObjects { public static void main(String[] args) { Employee emp1 = new Employee("1","bapi",1000,31); Employee emp2 = new Employee("2","mano",2000,29); Employee emp3 = new Employee("1","bapi",1000,31); // emp3 == emp1 duplicate object Employee emp4 = new Employee("3","Rohan",3000,27); Employee emp5 = new Employee("1","bapi",1000,31); // emp5 == emp3 == emp1 duplicate object RemoveDuplicateObjects obj = new RemoveDuplicateObjects(); // empList contains objects having duplicate values. How to remove duplicate? List<Employee> empList = new ArrayList<Employee>(); empList.add(emp1); empList.add(emp2); empList.add(emp3); empList.add(emp4); empList.add(emp5); if(emp1.equals(emp2)){ System.out.println("emp1 and emp2 are equal"); } if(emp1.equals(emp3)){ System.out.println("emp1 and emp3 are equal"); } obj.removeDuplicate(empList); } // method is used for removing objects having duplicate values private void removeDuplicate(List<Employee> empList) { Set<Employee> empSet = new HashSet<Employee>(); empSet.addAll(empList); for(Employee e: empSet){ System.out.println("id = "+e.getEmpid()); System.out.println("name = "+e.getEmpname()); System.out.println("sal = "+e.getSal()); System.out.println("age = "+e.getAge()); } } } Done! Now you can run the program and analyze the solution.
I suppose you want this: class pp { public static void main(String[] args) { Set<User> a = new HashSet<User>(); User u = new User(); u.setFirstName("Mike"); u.setLastName("Jordon"); a.add(u); u = new User(); u.setFirstName("Jack"); u.setLastName("Nicolson"); a.add(u); u = new User(); u.setFirstName("Jack"); u.setLastName("Nicolson"); a.add(u); for (User ss : a) { System.out.println(ss.getFirstName() + " " + ss.getLastName()); } } }
try this my friend : Iterator i = a.iterator(); while (i.hasNext()) { User u = (User) i.next(); boolean match = false; Iterator j = a.iterator(); boolean once = true; while (j.hasNext()) { if(once){j.next();} // to skip own occurence only once once = false; User u2 = (User) j.next(); if (u.getFirstName().equals(u2.getFirstName()) && u.getLastName().equals(u2.getLastName())) { match = true; } } if (!match) { // print } }
Override the equals method as suggested by Jason. Now for removing duplicates you need to use Set. List allows duplicate values so you will always have duplicate values. Set doesnot allow duplicate value so it will solve your problem.
You're using a Set of arrays, where the set has one element, namely an array of three Users. Arrays don't enforce or check uniqueness, which is why you get the same User twice. If you removed the arrays altogether, and simply used a Set, you'd get the "unique" behaviour you want.
First you should use a Set to store objects instead of a array if you dont want duplicates. (Arrays and List do allow duplicate objects to be stores) Second your equals methods should use String.equal method for comparison and should check for null values too to be on the safe side. I would use the IDE's auto generate feature for hashcode and equals methods always (i.e. Eclipse Source -> Generate hashCode() and equals()...) #Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); return result; } #Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (firstName == null) { if (other.firstName != null) return false; } else if (!firstName.equals(other.firstName)) return false; if (lastName == null) { if (other.lastName != null) return false; } else if (!lastName.equals(other.lastName)) return false; return true; } and main method public static void main(String[] args) { List<Set<User>> a = new ArrayList<Set<User>>(); Set<User> set = new HashSet<User>(); User u = new User(); u.setFirstName("Mike"); u.setLastName("Jordon"); set.add(u); u = new User(); u.setFirstName("Jack"); u.setLastName("Nicolson"); set.add(u); u = new User(); u.setFirstName("Jack"); u.setLastName("Nicolson"); set.add(u); a.add(set); for (Set<User> ss : a) { for (User user : ss) { System.out.println(user.getFirstName() + " " + user.getLastName()); } } }
In general, you can add elements to a Set to remove duplicates. However, you don't want to add the entire array to the collection in general; you just want to add the individual elements, like so: public static void main(String[] args) { Set<User> a = new HashSet<User>(); User[] u = new User[3]; u[0] = new User(); u[0].setFirstName("Mike"); u[0].setLastName("Jordon"); u[1] = new User(); u[1].setFirstName("Jack"); u[1].setLastName("Nicolson"); u[2] = new User(); u[2].setFirstName("Jack"); u[2].setLastName("Nicolson"); // Add each of the users to the Set. Note that there are three. for (User user : u) { a.add(u); } // Get the results back as an array. Note that this will have two. User[] duplicatesRemoved = new User[0]; a.toArray(duplicatesRemoved); }
Hi you can write a method in pp class in order to remove duplicate elements from the user array as follows : private User[] getUserArrayWithoutDuplicates(User[] a) { int count = a.length; Set<User> tempset = new HashSet<User>(); for (int i = 0; i < count; i++) { User[] user = a; int arraysize = user.length; for (int j = 0; j < arraysize; j++) tempset.add(user[j]); } User[] usr = new User[tempset.size()]; Iterator<User> tempIterator = tempset.iterator(); int p = 0; while (tempIterator.hasNext()) { User user = tempIterator.next(); usr[p] = new User(); usr[p].setFirstName(user.firstName); usr[p].setLastName(user.lastName); p++; } return usr; } This method will remove the duplicate entries from User array and return the User array without duplicate entries.