我在java中有一个ArrayList
。我从database
读取数据,并希望将每一行添加到此arraylist中
我的问题是我不知道一行有多少个参数。例如。如果我从桌上人那里读过,那么一个人有一个firstname, nickname, age
,如果我从另一张桌子上读过像玩家那样的数字参数不同。
如何动态创建可以添加数据的对象?
例如,如何动态创建类似这样的内容:Person = {"a", "b", 1}
,因此我有一个ArrayList<Person>
。
或者我应该创建ArrayList的ArrayList吗?
提前谢谢!
答案 0 :(得分:2)
你要求HashMap
吗?
Map<String, Object> person = new HashMap<String, Object>();
person.add("a", 1);
person.add("b", ...)
见
https://www.tutorialspoint.com/java/java_hashmap_class.htm http://beginnersbook.com/2013/12/hashmap-in-java-with-example/
那里有很多好的资源。
答案 1 :(得分:1)
您应该使用HashMap<String, Object>
,其中地图的键将是属性名称和Map的值,即与属性关联的值。
Map<String, Object> myPerson = new HashMap<String, Object>();
myPerson.add("name", "doe");
myPerson.add("age", 20L)
或者,您可以使用包含Map
的Wrapper类。
通过这种方式,您可以隐藏实现,并且可以向客户端提供自定义方法,例如在没有显式转换的情况下获取值的方法,并且可以为映射表提供名称:
示例:
public class DBObjectMapper{
private Map<String, Object> map = new HashMap<String, Object>();
private String tableName;
private DBObjectMapper(String tableName){
this.tableName=tableName;
}
public add(String key, Object value){
map.put(key,value);
}
public <T extends Object> T get(String key) {
return (T) map.get(key);
}
public String getTableName(){
return tableName;
}
}
现在,从映射器中检索值时,客户不需要进行显式转换:
DBObjectMapper mapper = new DBObjectMapper("person");
mapper.add("isEnabled", Boolean.valueOf(true);
mapper.add("name", "doe");
String mappedTable = mapper.getTableName();
Boolean b = mapper.get("isEnabled");
String string = mapper.get("name");
答案 2 :(得分:0)
实际上,您可以为每个人对象存储一个arraylist。像
这样的东西Person p = new Person;
p.addAttribute(dbValue);
addAttribute方法的作用是:
class Person{
//init myPersonArraylist
....
private void addAttribute(String attribute){
myPersonArraylist.add(attribute);
}
}
答案 3 :(得分:0)
如果您没有打开数据库的先验知识,那么将会有多少行,列或列类型。然后我会创建一个ArrayList<ArrayList<String>>
并只读取每一行,然后用逗号分隔(或者用你的分隔符)。这样,您就可以根据需要动态调整任意数量的列,这将适用于您正在访问的任何数据库的通用情况。
如果您了解数据库,那么我会为它创建适当的类。在您的示例中Person
。
class Person {
String firstName;
String nickname;
int age;
}
然后将每一行解析为Person
类,并将其添加到ArrayList<Person>
。