Java中的关联数组

时间:2015-08-10 10:24:00

标签: java list dictionary avro

我收到一个List<org.apache.avro.generic.GenericRecord>,其数据内容如下所示(为清晰起见,使用了JSON表示法)。如何使用Java最好地保存这些记录类型?

记录1:

   [
    {
      "serial_no" : "x",
      "data1" : "d"
    },
    {
     "serial_no" : "y",
     "data2" : "d2"
    },
    ............................MANY MORE
   ]

记录2:

   [
    {
      "id":"x",
      "type":"A"
    },
    {
      "id" : "x",
      "type" : "B"
    },
    {
      "id" : "y",
      "type" : "A",
    },
    { 
      "id" : "y",
      "type" : "B"
    } 
   ]

如您所见,每个serial number在record2中有两条记录。记录1中的serial_no与记录2中的id相同。

我的目标是:        最难找到这两条记录的方式。

解决方案我认为

创建一个类似

的地图
      map.put("x", [map.put("A",List), map.put("B",List)]);

但我觉得,它是一个复杂的结构。因为地图包含地图列表[each map is Map<String,List<Map<String,String>>>]

有什么建议吗?

修改

记录中的每个条目都是avro GenericRecord

4 个答案:

答案 0 :(得分:4)

看起来好像是在尝试使用Java解析JSON。为什么不使用特定的库? 与基本的http://www.json.org/java/或Google的https://github.com/google/gson

相同

否则,我不认为你提出的复杂结构特别慢。如果您认为更有效或更容易获取数据,您可能希望设计自己的对象类来保存数据。

修改

基于您的问题,我认为JSON是您收到的格式,抱歉。

我只是为GenericRecord创建一个包装器,或者将它子类化。然后添加提取数据所需的方法,或将其Comparable进行排序。

的内容
public class MyRecord extends GenericRecord implements Comparable<MyRecord>
{
    // Determine the type
    public int getType()
    {
        if ( this.get( "id") != null )
            return 2;
        return 1;
    }
    // Add methods that allow you to retrieve the serial field from any of the two record types
    public String getId()
    {
        if ( this.get( "id") != null )
            return (String)this.get("id");
        return (String)this.get("serial_no");
    }

    // add comparator methods that will allow you to sort the list, compare based on Id, etc
    @Override
    public int compareTo(MyRecord another) 
    {
        // Just a simple example
        return this.getId().compareTo( another.getId() );
    }
}

答案 1 :(得分:1)

为重复输入定义class es:

class SerialNoData {
    String serialNo;
    Object data;
}

class IdType {
    String id;
    String type;
}

解析后,将实例放入数组或List以获得所需的格式。

答案 2 :(得分:0)

地图的复杂程度并没有真正对速度产生影响。根据您使用的Map类型,获取记录列表将是恒定时间(具有相当小的开销)。在子列表中查找内容将为O(n),因为您需要遍历列表并查看所有地图。

答案 3 :(得分:0)

定义以下类

class Serial{
 String serial-no;
 String data;
 List<IdType> idTypes;
}

class IdType{
 String id;
 String type;
}

之后,您可以使用jackson或任何类型的JSON处理库。