Java中的关联性数组
我收到一个Java中的关联性数组,java,list,dictionary,avro,Java,List,Dictionary,Avro,我收到一个列表,其数据内容如下所示(为了清晰起见,使用了JSON符号)。如何使用Java最好地保存这些记录类型 记录1: [ { "serial_no" : "x", "data1" : "d" }, { "serial_no" : "y", "data2" : "d2" }, ............................MANY MORE ] [ { "id"
列表
,其数据内容如下所示(为了清晰起见,使用了JSON符号)。如何使用Java最好地保存这些记录类型
记录1:
[
{
"serial_no" : "x",
"data1" : "d"
},
{
"serial_no" : "y",
"data2" : "d2"
},
............................MANY MORE
]
[
{
"id":"x",
"type":"A"
},
{
"id" : "x",
"type" : "B"
},
{
"id" : "y",
"type" : "A",
},
{
"id" : "y",
"type" : "B"
}
]
记录2:
[
{
"serial_no" : "x",
"data1" : "d"
},
{
"serial_no" : "y",
"data2" : "d2"
},
............................MANY MORE
]
[
{
"id":"x",
"type":"A"
},
{
"id" : "x",
"type" : "B"
},
{
"id" : "y",
"type" : "A",
},
{
"id" : "y",
"type" : "B"
}
]
正如您在这里看到的,每个序列号在record2中都有两条记录<记录1中的代码>序列号与记录2中的id相同
我的目标是:
找到这两张唱片的最好方法
解决方案我认为:
创建一个类似于
map.put("x", [map.put("A",List), map.put("B",List)]);
但我觉得,这是一个复杂的结构。因为地图包含地图列表[每个地图都是地图]
有什么建议吗
编辑
记录中的每个条目都是看起来好像您正试图使用Java解析JSON。为什么不使用特定的库呢? 像基本的或者谷歌的 否则,我不认为你提议的复杂结构特别缓慢。如果您认为获取数据更有效或更容易,那么可能需要设计自己的对象类来保存数据
编辑 根据你的问题,我假设JSON是你收到的格式,对不起 我只想为GenericRecord创建一个包装器,或者将其子类化。然后添加提取数据所需的方法,或使其具有可比性以进行排序 类似于
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() );
}
}
公共类MyRecord扩展了GenericRecord
{
//确定类型
公共int getType()
{
if(this.get(“id”)!=null)
返回2;
返回1;
}
//添加允许您从两种记录类型中的任何一种检索序列字段的方法
公共字符串getId()
{
if(this.get(“id”)!=null)
返回(字符串)this.get(“id”);
返回(字符串)this.get(“序列号”);
}
//添加comparator方法,允许您对列表进行排序、基于Id进行比较等
@凌驾
公共整数比较(MyRecord另一个)
{
//只是一个简单的例子
将这个.getId().compareTo返回到(另一个.getId());
}
}
为重复输入定义类
es:
class SerialNoData {
String serialNo;
Object data;
}
及
);解析后,将实例放入数组或
列表中以获得所需的格式。地图的复杂程度对速度没有影响。根据您使用的映射类型,获取记录列表的时间是固定的(开销相当小)。在子列表中查找某些内容将是O(n),因为您需要遍历列表并查看所有映射。定义以下类
class Serial{
String serial-no;
String data;
List<IdType> idTypes;
}
class IdType{
String id;
String type;
}
class串行{
字符串序列号;
字符串数据;
列出各种类型;
}
类IdType{
字符串id;
字符串类型;
}
之后,您可以使用jackson或任何类型的JSON处理库。数据库会很快。为什么会被否决?您没有获得蓝色注释来指定原因吗?gson
有两个重载方法toJson
,fromJson
。在我的情况下,两者都没有用。你能详细说明一下吗?你收到的数据是实际的JSON吗?没有。这个答案的列表引起了更多的关注。你能帮我吗?你可能更喜欢连续剧。我更喜欢这个答案,让我试试。没有人。我需要地图上的所有数据。我可以第一次过滤它。因此,只有一个用于循环,然后O(1)用于所有get操作,那么你真的不应该担心速度。即使有1000万个条目,哈希映射查找也需要不到十分之一毫秒的时间。序列号
不是有效的标识符,而列表idTypes
用于什么?每个记录1都有多个记录2。这就是为什么我使用列表来包含记录2。我不明白“序列号不是有效的标识符”。作者的意思是,可以使用序列号从serial
中查找两个对应的IdType
结构。你不能在变量名中加“-”,我同意你的看法。我们不能在Java代码中使用“-”。但我们可以使用任何JSON库进行映射。(例如:-JsonMapping(“序列号”))