Java中的关联数组

5
我收到一个包含数据的List<org.apache.avro.generic.GenericRecord>,如下所示(使用JSON表示以便清晰)。我应该如何使用Java最好地保存这些记录类型?

记录1:

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

Record 2:

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

正如您在这里看到的,每个“序列号”在record2中有两条记录。 record1中的“serial_no”与record2中的“id”相同。

我的目标是: 找到这两个记录的最快方法。

我想到的解决方案:

创建一个类似于地图的东西

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

但我觉得它是一个复杂的结构。因为map包含映射列表[每个映射都是Map<String,List<Map<String,String>>>]

有什么建议吗?

编辑

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


一个数据库会很快。 - Kayaman
为什么被踩了?你没有收到“蓝色提示”来指明原因吗? - Gibbs
4个回答

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() );
    }
}

"gson"有两个重载方法"toJson"和"fromJson"。在我的情况下,两者都不太有用。您能否详细说明一下? - Gibbs
你是否接收到实际的JSON数据? - mvreijn
不是的。这是一个GenericRecord列表。 - Gibbs
1
这个回答正在受到更多的关注。能否请点赞的人帮帮我? - Gibbs

1
定义重复条目的 class
class SerialNoData {
    String serialNo;
    Object data;
}

并且

class IdType {
    String id;
    String type;
}

一旦解析完成,将实例放入数组或List中以获得所需的格式。


你可能更喜欢使用serialNo。 - Pieter De Bie
我更喜欢这个答案,让我试一试。 - Gibbs

0

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


不行。我需要地图中的所有数据。我可以通过第一次筛选它。这样只需要一个循环,然后对于所有获取操作都是O(1)。 - Gibbs
那么你真的不应该担心速度问题。即使有一千万条目,哈希映射查找也只需要不到十分之一毫秒的时间。 - Astrogat

0

定义以下类

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

class IdType{
 String id;
 String type;
}

之后您可以使用Jackson或任何一种JSON处理库。


"serial-no" 不是一个有效的标识符,而 "List<IdType> idTypes" 是什么意思? - Binkan Salaryman
每个记录1都有多个记录2。这就是为什么我使用List来包含Records2的原因。我不理解“serial-no不是有效的标识符”。 - Damith Ganegoda
作者的意思是,可以使用“Serial”中的序列号查找两个相应的“IdType”结构。变量名中不能使用“-”,请参阅标识符 - Binkan Salaryman
1
我同意你的观点。在Java代码中我们不能使用“-”,但是我们可以使用任何JSON库进行映射。(例如:JsonMapping("serial-no")) - Damith Ganegoda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接