简体   繁体   中英

Map array to object

I have an array defined as follows:

String [] source = {"26", "Tom", "foo", ...};

And a Person class:

public class Person{
   private String age;
   private String name;
   private String print;
   private String ......;//the same type and order and number of source
   public Person() {

   }
   //full construtors
   public Person(String age, String name, String print,String ....) {
       this.age = age;
       this.name = name;
       this.print = print;
       //....
    }

    /* setters & getters */

}

How can I map these values to a Person instance?

this is my real coding

  public static List<BasicalVo> readObject(String path) throws IOException, NoSuchMethodException {
        InputStreamReader fReader = new InputStreamReader(new FileInputStream(path),"gb2312");
        BufferedReader bufferedReader = new BufferedReader(fReader);
        String currentLine;
        String[] temp;
        List<BasicalVo> basicalVoList= new ArrayList<BasicalVo>();
        while ((currentLine = bufferedReader.readLine()) != null) {
            temp = currentLine.split(",");//I get the Array
            for (int i = 0; i < temp.length; i++) {
                //I don't know hot to translate to BasicalVo .
                BasicalVo vo = new BasicalVo();
                basicalVoList.add(vo);
            }
        }
        return basicalVoList;
    }

If the source just contains one person's data then you can do this:

Person p = new Person(source[0], source[1], source[2] ...);

If the array is too short an ArrayIndexOutOfBoundsException will be thrown.

I.

If the array contains only one Person you only need to create the instance like this :

String[] source = new String[]{"26", "tom", "xx", "....."};
Person p = new Person(source[0], source[1], source[2], source[3],...);

Because you'll know how many parameters there is in the constructor and so you won't have an ArrayIndexOutOfBoundsException if the array is well-build


II.

Assuming you have only 3 attributes, you'll be able to do like this if the array is like this :

String[] source = new String[]{"26", "tom", "xx", "22", "john", "yy"};
ArrayList<Person> list = new ArrayList<>()
for (int i = 0; i < source.length; i += 3) {
     list.add(new Person(source[i], source[i + 1], source[i + 2]));
}

III.

If you have multiple fields, you would better do like this :

public Person(String[]source) {
       this.age = source[0];
       this.name = source[1];
       this.print = source[2];
       //....
}

Because it wouldn't not surcharge the code you have in your loop which read from the data, and make it easier to do your stuff, and in fact this is not hard, because in every case if you have like 20 fields, you'll have to assignate these 20 attributs


IV.

Or last proposition with a factory method :

public static Person createPersoneFromArray(String[] array) {
    Person p = new Person();
    p.setAge(array[0]);
    p.setName(array[1]);
    //...
    return p;
}

And in the main method :

Person p = Person.createPersoneFromArray(source);

you can also add another constructor to your BasicalVo class which takes a String[] as input :

public BasicalVo(String [] input) {
   this.age = input[0];
   this.name = input[1];
   this.print = input[2];
   //....
}

which you then can call in your main as follows without additional for loop

....
temp = currentLine.split(",");
BasicalVo vo = new BasicalVo(temp);
basicalVoList.add(vo);
....

In this specific case I think that your best option is to use reflection. Reflection are a set of classes and interfaces that allow you to call different methods at execution time. For instance:

String [] source = { "26", "tom", "xx", ... };
Constructor constructor = Person.class.getConstructors()[0]
constructor.newInstance(source)

Take into account that this example only works because you have only one constructor, and so Person.class.getConstructors()[0] returns the constructor you want. YOu can try to get the specific constructor with Person.class.getConstructors(Class<?>...) , in that case you would need to pass as a parameter an array with the type of the arguments.

You can use OpenCSV

CSVReader csvReader = new CSVReader(new FileReader("people.csv"),',');
ColumnPositionMappingStrategy mappingStrategy = new ColumnPositionMappingStrategy();
mappingStrategy.setType(Person.class);
String[] columns = new String[]{"age","name","print"};
mappingStrategy.setColumnMapping(columns);
CsvToBean ctb = new CsvToBean();
List personList = ctb.parse(mappingStrategy, csvReader);

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