简体   繁体   中英

Convert string array with 3 pieces of information into an array of objects - JAVA

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:

  1. I'm using a List instead of an array, a list can grow dynamically and you don't need to specify the size up front, it's also a bit easier to work with than an array.
  2. Use a foreach loop instead of standard for, you don't need the index so a foreach is perfect
  3. When splitting the line, just check you get the expected number of parts, perhaps treat the others as errors, so safeguard yourself later when you expect to find certain things in certain spots.
  4. The trim lets you get rid of whitespace, it's always good to clean the data as soon as you can so you don't get junk filtering through your application.
  5. Consider using Lombok , it gives you nice annotations to generate accessor methods, toString etc

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM