列表<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- 如果结构的初始化(作为 ArrayListHashMap)是大量 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),除非您经常修改列表的开头,在这种情况下,建议使用 LinkedListHashMap 有很好的性能,但如果你需要排序数据,你可以使用 TreeMap 代替。如果你需要保持插入顺序 LinkedHashMap 将是最好的。

如果结构可能有所不同,是的,这是正确的方法。

如果每个 name 都是唯一的,您可以使用 Map<String,String>

如果结构始终相同(nameotherAttr 对),您可以使用 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提供构造函数,设置nameotherAttr

的值
 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>();

不质疑你所做事情的本质,我会直接回答你的问题,说你可能以正确的方式使用最佳数据结构。