通过解析表格数据来创建Java对象

时间:2014-04-14 08:09:21

标签: java

我有表格格式的数据,如下所示

id | Firstname | Lastname | Mo_Number 
--------------------------------------
1    Chirag      patel      77887*****
1    Chirag      patel      99002*****
1    Chirag      patel      88937*****
2    Devang      patel      90900*****
2    Devang      patel      45090*****
2    Devang      patel      65900***** 

我想将此表解析为java。

在java类中创建了以下类

package com.mirdb.model;

import java.util.Set;

public class Person {

private int id;
    private String fName;
private String lName;
private Set<String> moNumbers;


}

任何人都可以告诉我通过解析上表可以给我个人对象列表的方法。

2 个答案:

答案 0 :(得分:2)

因此,假设您的数据位于通过JDBC访问的数据库中,并且您拥有保存数据的ResultSet,那么您可能希望执行以下操作:

while(result.next()) {
    Person p = new Person();
    p.setId( result.getInt("id") );
    p.setfName( result.getString("Firstname ") );
    // ...
}

显然我假设你的Person类有一个可见的默认构造函数和所有字段的getter / setter方法。如果指向正确的方向,则应look at this tutorial


修改:添加可以的方式(有很多方法!)处理每个人的多个电话号码。

Map<Integer,Person> persons = new HashMap<Integer,Person>();
while(result.next()) {
    int id = result.getInt("id");
    Person p = persons.get(id);
    if (null == p) {
        p = new Person();
        // .. add all info to person (without phone number)
        persons.put(id,p);
    }
    p.moNumbers.add(result.getString("Mo_Number"));
}

答案 1 :(得分:0)

我怀疑是否可以开箱即用,尤其是因为您似乎错过了Person对象中的ID参数。

一种可能的解决方案可能是在Person类中使用一个构造函数,该构造函数将字符串作为参数。此字符串将表示文本文件中的一行,然后构造函数将解构(.split("\\t")可能?)然后根据您传递的字符串初始化正确的值。

编辑:看到你的评论,你可以尝试在this之前的SO帖子中做一些建议:

List<Person> pList = new ArrayList<Person>();
while (rs4.next()) {
    pList.add(new Person(rs4.getString(0), rs4.getString(1)...);
}
...
return pList;

对于人:

package com.mirdb.model;

import java.util.Set;

public class Person {

private String ID;
private String fName;
private String lName;
private Set<String> moNumbers;

    public Person(String id, String fName, String lName, Set<String> moNumbers)
    {
        this.ID = id;
        this.fName = fName;
        ...
    }

    ...
    public String getID(){return this.ID;}
    ...

    public boolean equals(object obj)
    {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof Person))
            return false;

        Person rhs = (Person) obj;
        return rhs.getID().equals(this.getID());
     }
}

编辑:根据您的其他问题:But question is how can I make Set<String> moNumbers so that I can pass it to constructor??

在你的例子中,你只显示一个蒙面数字(至少我认为是*代表的。如果你只有一个数字,你可以这样做:

List<Person> pList = new ArrayList<Person>();
while (rs4.next()) {
    Set<String> mobileNumbers = new HashSet<String>();
    mobileNumbers.add(rs4.getString(3));
    // if on the other hand you have multiple comma delimeted numbers, you could try the approach below:
    //Set<String> mobileNumbers = new HashSet<String>(Arrays.asList(rs4.getString(3).split(",")));
    pList.add(new Person(rs4.getString(0), rs4.getString(1), rs.getString(2), mobileNumbers);
}

return pList;