我是Java的新手,我正在制作一个包装这类数据的结构:
Object:
name:'Obj1'
otherAttr:'...'
Object:
name:'Obj2'
otherAttr:'...'
Object:
...
我知道我可以创建自定义的'Object'类*,但是对于使用内置java结构,我使用List<Map<String, String>>
。所以,设置新的:
List<Map<String, String>> objects = new ArrayList<Map<String, String>>();
foreach(databaseRow){
Map<String, String> newObject = new HashMap<String, String>();
newObject.put('name', '...');
newObject.put('otherAttr', '...');
objects.add(newObject);
}
我有两个问题:
1-如果结构的初始化(作为ArrayList
和HashMap
)是大量Java结构之间的最佳选择。
2-如果有一个内置结构,并不意味着所有这些初始化(对于List和每个Map)。
谢谢!
(*) CLARIFICATION:我在代码中使用了大量类似的结构,我会避免编写很多自定义类。但如果这是最好的方式,那就让我们做吧!
答案 0 :(得分:2)
如果每个对象只有这两个属性(name和otherAttr),则可以使用字段创建一个类而不是使用Map:
public class Data {
private final String name;
private final String otherAttr;
// constructor, getters
}
即使您拥有更多属性,这样做也可能很有用,因为它为您提供了编译时的安全性 - 您永远不会拼错键。您还可以拥有不同类型的字段,而不仅仅是您必须解析的字符串。
为了使您的代码更有意义,您还可以扩展现有的数据结构,例如:
public class Data extends HashMap<String, String> {
// extra convenience constructors
}
public class DataList extends ArrayList<Data> {
// extra convenience constructors
}
关于你的问题,使用哪些收藏品,这取决于你需要什么。 ArrayList
通常是一个不错的选择(或线程安全的Vector
),除非您经常修改列表的开头,在这种情况下建议使用LinkedList
。 HashMap
具有非常好的性能,但如果您需要排序数据,则可以使用TreeMap
。如果您需要维持插入顺序LinkedHashMap
将是最好的。
答案 1 :(得分:2)
如果结构可能有所不同,是的,这是正确的方法。
如果每个name
都是唯一的,您可以使用Map<String,String>
。
如果结构总是相同的(name
和otherAttr
对),您可以使用POJO(普通的旧java对象),这是对象的奇特名称有吸气剂和二传手:
public class MyData {
private String name;
private String otherAttr;
public String getName() {return name;}
public void setName(String name) {this.name=name;}
public String getOtherAttr() {return otherAttr;}
public void setOtherAttr(String otherAttr) {this.otherAttr=otherAttr;}
}
然后将它们存储在List<MyData>
。
您可以为MyData
提供构造函数,设置name
和otherAttr
的值
MyData(String name, String otherAttr) {
this.name=name;
this.otherAttr=otherAttr
}
答案 2 :(得分:1)
你可以让自己的班级拥有这个对象的列表。
List<myClass> objects = new ArrayList<myClass>();
答案 3 :(得分:1)
1-如果结构的初始化(作为ArrayList和HashMap)是大量Java结构之间的最佳选择。
不,编写自己的自定义类来保存数据。封装的全部内容是隐藏实现细节。
2-如果有一个内置结构,并不意味着所有这些初始化(对于List和每个Map)。
如果你编写自己的类,你的类的构造函数可以 处理初始化。这就是构造函数的用途。
答案 4 :(得分:1)
这是正确的,但如果你想要一个更清洁的方法,你为什么不创建
public Class MyData{
private String name;
private String attr; //in case you need multiple attributes, make this as list
//setters and getters
}
然后再做
List<MyData> objects = new ArrayList<MyData>();
答案 5 :(得分:1)
在不质疑你正在做的事情的本质的情况下,我将直接回答你的问题,说你可能正确地使用最佳数据结构。