I am trying to convert an array that has three pieces of customer information in each bin:
String[] csv = {" jimmy ,johnson,jjohnson@gmail.com",
"Joe,Donald,Joe_Donald@donald.org",
"ARTHUR,THOMPSON,ARTHUR@thompson.org"};
I have a class (Customers) that includes a constructor to make a customer with the first name, the last name, and an email.
String customerList = "";
for (int i = 0; i < csv.length; i++) {
customerList += csv[i];
}
String[] customers = customerList.split(",");
Customer[] customs = new Customer[(customers.length / 3)];
for (int i = 0; i < customers.length / 3; i += 3) {
customs[i] = new Customer(customers[i], customers[i + 1], customers[i + 2]);
}
System.out.println(customs[0].getFirst_name());
System.out.println(customs[0].getLast_name());
System.out.println(customs[0].getEmail());
This gets me almost to where I need to be, however there is one small problem-- when the information is being stored in the array, it does not consider the comma in the original array as one of the commas I am trying to use as a split. Here is what the code above gives me:
Email Creator
=========================
jimmy
johnson
jjohnson@gmail.comJoe
As you can see, the first bits of information is correct, but Joe (the first name of the second person) is lumped in with the first customer.
Calling
customerList += csv[i];
will give you a String that looks like
jimmy ,johnson,jjohnson@gmail.comJoe,Donald,Joe_Donald@donald.orgARTHUR,THOMPSON,ARTHUR@thompson.org
There's probably multiple ways to fix it, but I would try adding a comma after you concatenate each entry from the csv array:
customerList += csv[i] + ",";
Why do you need String customerList = "";
? You can get the customs array like this:
String[] csv = {" jimmy ,johnson,jjohnson@gmail.com",
"Joe,Donald,Joe_Donald@donald.org",
"ARTHUR,THOMPSON,ARTHUR@thompson.org"};
Customer[] customs = new Customer[csv.length];
for (int i = 0; i < csv.length; i++) {
String[] splitted = csv[i].split(",");
customs[i] = new Customer(splitted[0].trim(), splitted[1].trim(), splitted[2].trim());
}
Using Streams?
List<Customer> customer = Arrays.stream(customerList).map(
s->{
String[] items = s.split(",");
return new Customer(items[0], items[1], items[2]);
}
}.collect(Collectors.toList());
I think this was what you wanted to achieve,
String[] csv = {" jimmy ,johnson,jjohnson@gmail.com",
"Joe,Donald,Joe_Donald@donald.org",
"ARTHUR,THOMPSON,ARTHUR@thompson.org"};
Customer[] customs = new Customer[csv.length];
for (int i = 0; i < csv.length ; i++) {
String[] customerDetails = csv[i].split(",");
customs[i] = new Customer(customerDetails[0].trim(), customerDetails[1].trim(), customerDetails[2].trim());
}
System.out.println(customs[0].getFirst_name()));
System.out.println(customs[0].getLast_name());
System.out.println(customs[0].getEmail());
I would start by overriding toString
in Customer
. You didn't post your version of Customer
, but that might look like
public class Customer {
private String firstName;
private String lastName;
private String email;
public Customer(String first, String last, String email) {
this.firstName = first.trim();
this.lastName = last.trim();
this.email = email.trim();
}
@Override
public String toString() {
return String.format("first: %s, last: %s, email: %s", firstName, lastName, email);
}
}
Then you might use String.split
and Arrays.stream
and map your entries to Customer
instances like
String[] csv = { " jimmy ,johnson,jjohnson@gmail.com", "Joe,Donald,Joe_Donald@donald.org",
"ARTHUR,THOMPSON,ARTHUR@thompson.org" };
List<Customer> customs = Arrays.stream(csv).map(s -> s.split("\\s*,\\s*"))
.map(t -> new Customer(t[0], t[1], t[2])).collect(Collectors.toList());
for (Customer c : customs) {
System.out.println(c);
}
And I get
first: jimmy, last: johnson, email: jjohnson@gmail.com
first: Joe, last: Donald, email: Joe_Donald@donald.org
first: ARTHUR, last: THOMPSON, email: ARTHUR@thompson.org
Here's a suggestion for you, a couple of things to point out:
sample code:
public static void main(String[] args) throws IOException {
String[] csv = {
" jimmy ,johnson,jjohnson@gmail.com",
"Joe,Donald,Joe_Donald@donald.org",
"ARTHUR,THOMPSON,ARTHUR@thompson.org"
};
// use a List rather than array, so it can grow dynamically
List<Customer> customers = new ArrayList<Customer>();
for (String line : csv) {
System.out.println("Processing line: " + line);
String[] parts = line.split(",");
if (parts.length != 3) {
System.out.println("Expected to find 3 parts in the line, but got " + parts.length);
}
// construct the customer, notice the .trim() to remove any whitespace
Customer customer = new Customer(parts[0].trim(), parts[1].trim(), parts[2].trim());
customers.add(customer);
}
System.out.println("Printing out customer list:");
// loop through the customers and print them out
for (Customer c : customers) {
System.out.println("firstName: " + c.firstName);
System.out.println("lastName: " + c.lastName);
System.out.println("email: " + c.email);
System.out.println("\n");
}
}
static class Customer {
// accessors removed, consider using Lombok for @Data, @Getter, @Setter etc
String firstName;
String lastName;
String email;
public Customer(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
}
This is the output I get, which I believe is what you're looking for
Processing line: jimmy ,johnson,jjohnson@gmail.com
Processing line: Joe,Donald,Joe_Donald@donald.org
Processing line: ARTHUR,THOMPSON,ARTHUR@thompson.org
Printing out customer list:
firstName: jimmy
lastName: johnson
email: jjohnson@gmail.com
firstName: Joe
lastName: Donald
email: Joe_Donald@donald.org
firstName: ARTHUR
lastName: THOMPSON
email: ARTHUR@thompson.org
Good luck!
I think your best bet here is to treat each element of your csv array as a distinct customer. There's no need to concatenate them all into one big string.
String[] csv = {" jimmy ,johnson,jjohnson@gmail.com",
"Joe,Donald,Joe_Donald@donald.org",
"ARTHUR,THOMPSON,ARTHUR@thompson.org"};
Customer[] customs = new Customer[csv.length];
for (int cidx = 0; cidx < csv.length; cidx++) {
String[] fields = csv[cidx].split(",");
customs[cidx++] = new Customer(
fields.length>0 ? fields[0].trim() : null,
fields.length>1? fields[1].trim() : null,
fields.length>2? fields[2].trim() : null);
}
for (Customer custom : customs) {
System.out.println("first="+custom.getFirst_name() + ", last="+custom.getLast_name()+", email="+custom.getEmail());
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.