列表<map <string,string =“”>&gt; alternative(Java)</map <string,>

时间:2015-02-26 11:23:06

标签: java data-structures

我是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-如果结构的初始化(作为ArrayListHashMap)是大量Java结构之间的最佳选择。

2-如果有一个内置结构,并不意味着所有这些初始化(对于List和每个Map)。

谢谢!

(*) CLARIFICATION:我在代码中使用了大量类似的结构,我会避免编写很多自定义类。但如果这是最好的方式,那就让我们做吧!

6 个答案:

答案 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),除非您经常修改列表的开头,在这种情况下建议使用LinkedListHashMap具有非常好的性能,但如果您需要排序数据,则可以使用TreeMap。如果您需要维持插入顺序LinkedHashMap将是最好的。

答案 1 :(得分:2)

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

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

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

 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)

在不质疑你正在做的事情的本质的情况下,我将直接回答你的问题,说你可能正确地使用最佳数据结构。