列表<Map<String, String>> 备选方案 (Java)
List<Map<String, String>> alternatives (Java)
我是 Java 的新手,我正在制作一个用于包装此类数据的结构:
Object:
name:'Obj1'
otherAttr:'...'
Object:
name:'Obj2'
otherAttr:'...'
Object:
...
我知道我可以自定义 'Object' class*,但是为了使用内置 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)。
谢谢!
(*)澄清:我在我的代码中使用了很多类似的结构,我会避免做很多自定义 classes。但如果这是最好的方法,那就去做吧!
您可以创建自己的 class 并拥有此对象的列表。
List<myClass> objects = new ArrayList<myClass>();
1- 如果结构的初始化(作为 ArrayList 和 HashMap)是大量 Java 结构之间的最佳选择。
No, write your own custom class(es) to hold the data. The whole point of encapsulation is to hide away the implementation details.
2- 如果有一个内置结构不暗示所有这些初始化(对于 List 和每个 Map)。
If you write your own class, your constructors for the class can
handle the initialisation. That is what constructors are for.
如果您的每个对象都只有这两个属性(name 和 otherAttr),您可以创建一个带有字段的 class 而不是使用 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
将是最好的。
如果结构可能有所不同,是的,这是正确的方法。
如果每个 name
都是唯一的,您可以使用 Map<String,String>
。
如果结构始终相同(name
和 otherAttr
对),您可以使用 POJO(普通旧 java 对象),它是带有 getter 和 setter 的对象的奇特名称:
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
}
这是正确的,但如果您想要一种更简洁的方法,为什么不创建
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>();
不质疑你所做事情的本质,我会直接回答你的问题,说你可能以正确的方式使用最佳数据结构。
我是 Java 的新手,我正在制作一个用于包装此类数据的结构:
Object:
name:'Obj1'
otherAttr:'...'
Object:
name:'Obj2'
otherAttr:'...'
Object:
...
我知道我可以自定义 'Object' class*,但是为了使用内置 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)。
谢谢!
(*)澄清:我在我的代码中使用了很多类似的结构,我会避免做很多自定义 classes。但如果这是最好的方法,那就去做吧!
您可以创建自己的 class 并拥有此对象的列表。
List<myClass> objects = new ArrayList<myClass>();
1- 如果结构的初始化(作为 ArrayList 和 HashMap)是大量 Java 结构之间的最佳选择。
No, write your own custom class(es) to hold the data. The whole point of encapsulation is to hide away the implementation details.
2- 如果有一个内置结构不暗示所有这些初始化(对于 List 和每个 Map)。
If you write your own class, your constructors for the class can handle the initialisation. That is what constructors are for.
如果您的每个对象都只有这两个属性(name 和 otherAttr),您可以创建一个带有字段的 class 而不是使用 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
将是最好的。
如果结构可能有所不同,是的,这是正确的方法。
如果每个 name
都是唯一的,您可以使用 Map<String,String>
。
如果结构始终相同(name
和 otherAttr
对),您可以使用 POJO(普通旧 java 对象),它是带有 getter 和 setter 的对象的奇特名称:
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
}
这是正确的,但如果您想要一种更简洁的方法,为什么不创建
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>();
不质疑你所做事情的本质,我会直接回答你的问题,说你可能以正确的方式使用最佳数据结构。