在Java中将guava表值写入文件 [英] writing guava table values into file in java
问题描述
这样做的最好方法是什么?
表中的价值观并不重要。我的主要目的是编写和阅读表。
有不同的方法来模拟一个表的持久性和不同的方法是更好的不同对于一般的目的(即不针对任何特定类型的表格而言),表格类型(例如,密集的vs parse,数组表格vs基于表格的表格等)。
我可能坚持以下几点:$ b
$ b
- 行键的数组
- 数组列键
- 单元格数组,其中每个单元格包含以下内容:
- 其行键的索引行键的数组
- 列键的数组中列键的索引
- 值
/ gsonrel =nofollow noreferrer> google / gson:可以转换Java Ob的Java序列化/反序列化库 - 其行键的索引行键的数组
- an array of the row keys
- an array of the column keys
- an array of cells where each cell contains the following:
- the index of its row key in the array of the row keys
- the index of its column key in the array of the column keys
- the value
例子:
class TableTypeHierarchyAdapter< R,C,V>实现JsonSerializer<表< R,C,V>>,JsonDeserializer<表< R,C,V>> {
@Override
public JsonElement serialize(Table< R,C,V> src,Type typeOfSrc,JsonSerializationContext context){
JsonArray rowKeysJsonArray = new JsonArray();
Map< R,Integer> rowKeyToIndex = new HashMap<>(); (R rowKey:src.rowKeySet()){
rowKeyToIndex.put(rowKey,rowKeyToIndex.size());
rowKeysJsonArray.add(context.serialize(rowKey));
}
JsonArray columnKeysJsonArray = new JsonArray();
地图< C,Integer> columnKeyToIndex = new HashMap<>();
for(C columnKey:src.columnKeySet()){
columnKeyToIndex.put(columnKey,columnKeyToIndex.size());
columnKeysJsonArray.add(context.serialize(columnKey));
}
JsonArray cellsJsonArray = new JsonArray(); (Table.Cell< R,C,V> cell:src.cellSet()){
JsonObject cellJsonObject = new JsonObject();
int rowIndex = rowKeyToIndex.get(cell.getRowKey());
int columnIndex = columnKeyToIndex.get(cell.getColumnKey());
cellJsonObject.addProperty(rowIndex,rowIndex);
cellJsonObject.addProperty(columnIndex,columnIndex);
cellJsonObject.add(value,context.serialize(cell.getValue()));
cellsJsonArray.add(cellJsonObject);
}
JsonObject tableJsonObject = new JsonObject();
tableJsonObject.add(rowKeys,rowKeysJsonArray);
tableJsonObject.add(columnKeys,columnKeysJsonArray);
tableJsonObject.add(cells,cellsJsonArray);
return tableJsonObject;
}
@Override
public Table< R,C,V>反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext上下文){
类型typeOfR;
类型typeOfC;
类型typeOfV;
{
ParameterizedType parameterizedType =(ParameterizedType)typeOfT;
类型[] actualTypeArguments = parameterizedType.getActualTypeArguments();
typeOfR = actualTypeArguments [0];
typeOfC = actualTypeArguments [1];
typeOfV = actualTypeArguments [2];
}
JsonObject tableJsonObject = json.getAsJsonObject();
JsonArray rowKeysJsonArray = tableJsonObject.getAsJsonArray(rowKeys);
Map< Integer,R> rowIndexToKey = new HashMap<>();
for(JsonElement jsonElement:rowKeysJsonArray){
R rowKey = context.deserialize(jsonElement,typeOfR);
rowIndexToKey.put(rowIndexToKey.size(),rowKey);
}
JsonArray columnKeysJsonArray = tableJsonObject.getAsJsonArray(columnKeys);
Map< Integer,C> columnIndexToKey = new HashMap<>();
for(JsonElement jsonElement:columnKeysJsonArray){
C columnKey = context.deserialize(jsonElement,typeOfC);
columnIndexToKey.put(columnIndexToKey.size(),columnKey);
}
JsonArray cellsJsonArray = tableJsonObject.getAsJsonArray(cells);
ImmutableTable.Builder< R,C,V> builder = ImmutableTable.builder(); (JsonElement jsonElement:cellsJsonArray){
JsonObject cellJsonObject = jsonElement.getAsJsonObject();
int rowIndex = cellJsonObject.get(rowIndex)。getAsInt();
int columnIndex = cellJsonObject.get(columnIndex)。getAsInt();
R rowKey = rowIndexToKey.get(rowIndex);
C columnKey = columnIndexToKey.get(columnIndex);
V value = context.deserialize(cellJsonObject.get(value),typeOfV);
builder.put(rowKey,columnKey,value);
}
return builder.build();
$ / code $ / pre
用法:
表< String,String,String> table = ImmutableTable。< String,String,String> builder()
.put(R1,C1,R1C1)
.put(R1,C2 (R2,C1,R2C1)
.put(R2,C2,R2C2)
.build();
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.registerTypeHierarchyAdapter(Table.class,new TableTypeHierarchyAdapter())
.create();
try(FileWriter writer = new FileWriter(table.json)){
gson.toJson(table,writer);
}
try(FileReader reader = new FileReader(table.json)){
Type typeOfTable = new TypeToken< Table< String,String,String>>(){}的getType();
表< String,String,String> readTable = gson.fromJson(reader,typeOfTable);
assert table.equals(readTable);
$ / code $ / pre
table.json:
{
rowKeys:[
R1,
R2
,
columnKeys :[
C1,
C2
],
cells:[
{
rowIndex:0,
columnIndex:0,
value:R1C1
},
{
rowIndex:0,
columnIndex:1,
value:R1C2
},
{
rowIndex:1,
columnIndex:0,
value: R2C1
,
{
rowIndex:1,
columnIndex:1,
value:R2C2
}
]
}
How to write Guava table into a file ?
What is the best way of doing this ?
It is not important how values seems in table. My primary aim writing and reading table.
解决方案 There are various ways to model a table for persistence and different approaches are better for different types of tables (e.g. dense vs parse, array table vs tree based table, etc.).
For a general purpose (i.e. not optimized for any particular type of table) I would probably persist the following:
With that in mind you can accomplish such using google/gson: A Java serialization/deserialization library that can convert Java Objects into JSON and back.
Example:
class TableTypeHierarchyAdapter<R, C, V> implements JsonSerializer<Table<R, C, V>>, JsonDeserializer<Table<R, C, V>> {
@Override
public JsonElement serialize(Table<R, C, V> src, Type typeOfSrc, JsonSerializationContext context) {
JsonArray rowKeysJsonArray = new JsonArray();
Map<R, Integer> rowKeyToIndex = new HashMap<>();
for (R rowKey : src.rowKeySet()) {
rowKeyToIndex.put(rowKey, rowKeyToIndex.size());
rowKeysJsonArray.add(context.serialize(rowKey));
}
JsonArray columnKeysJsonArray = new JsonArray();
Map<C, Integer> columnKeyToIndex = new HashMap<>();
for (C columnKey : src.columnKeySet()) {
columnKeyToIndex.put(columnKey, columnKeyToIndex.size());
columnKeysJsonArray.add(context.serialize(columnKey));
}
JsonArray cellsJsonArray = new JsonArray();
for (Table.Cell<R, C, V> cell : src.cellSet()) {
JsonObject cellJsonObject = new JsonObject();
int rowIndex = rowKeyToIndex.get(cell.getRowKey());
int columnIndex = columnKeyToIndex.get(cell.getColumnKey());
cellJsonObject.addProperty("rowIndex", rowIndex);
cellJsonObject.addProperty("columnIndex", columnIndex);
cellJsonObject.add("value", context.serialize(cell.getValue()));
cellsJsonArray.add(cellJsonObject);
}
JsonObject tableJsonObject = new JsonObject();
tableJsonObject.add("rowKeys", rowKeysJsonArray);
tableJsonObject.add("columnKeys", columnKeysJsonArray);
tableJsonObject.add("cells", cellsJsonArray);
return tableJsonObject;
}
@Override
public Table<R, C, V> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
Type typeOfR;
Type typeOfC;
Type typeOfV;
{
ParameterizedType parameterizedType = (ParameterizedType) typeOfT;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
typeOfR = actualTypeArguments[0];
typeOfC = actualTypeArguments[1];
typeOfV = actualTypeArguments[2];
}
JsonObject tableJsonObject = json.getAsJsonObject();
JsonArray rowKeysJsonArray = tableJsonObject.getAsJsonArray("rowKeys");
Map<Integer, R> rowIndexToKey = new HashMap<>();
for (JsonElement jsonElement : rowKeysJsonArray) {
R rowKey = context.deserialize(jsonElement, typeOfR);
rowIndexToKey.put(rowIndexToKey.size(), rowKey);
}
JsonArray columnKeysJsonArray = tableJsonObject.getAsJsonArray("columnKeys");
Map<Integer, C> columnIndexToKey = new HashMap<>();
for (JsonElement jsonElement : columnKeysJsonArray) {
C columnKey = context.deserialize(jsonElement, typeOfC);
columnIndexToKey.put(columnIndexToKey.size(), columnKey);
}
JsonArray cellsJsonArray = tableJsonObject.getAsJsonArray("cells");
ImmutableTable.Builder<R, C, V> builder = ImmutableTable.builder();
for (JsonElement jsonElement : cellsJsonArray) {
JsonObject cellJsonObject = jsonElement.getAsJsonObject();
int rowIndex = cellJsonObject.get("rowIndex").getAsInt();
int columnIndex = cellJsonObject.get("columnIndex").getAsInt();
R rowKey = rowIndexToKey.get(rowIndex);
C columnKey = columnIndexToKey.get(columnIndex);
V value = context.deserialize(cellJsonObject.get("value"), typeOfV);
builder.put(rowKey, columnKey, value);
}
return builder.build();
}
}
Usage:
Table<String, String, String> table = ImmutableTable.<String, String, String>builder()
.put("R1", "C1", "R1C1")
.put("R1", "C2", "R1C2")
.put("R2", "C1", "R2C1")
.put("R2", "C2", "R2C2")
.build();
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.registerTypeHierarchyAdapter(Table.class, new TableTypeHierarchyAdapter())
.create();
try (FileWriter writer = new FileWriter("table.json")) {
gson.toJson(table, writer);
}
try (FileReader reader = new FileReader("table.json")) {
Type typeOfTable = new TypeToken<Table<String, String, String>>() {}.getType();
Table<String, String, String> readTable = gson.fromJson(reader, typeOfTable);
assert table.equals(readTable);
}
table.json:
{
"rowKeys": [
"R1",
"R2"
],
"columnKeys": [
"C1",
"C2"
],
"cells": [
{
"rowIndex": 0,
"columnIndex": 0,
"value": "R1C1"
},
{
"rowIndex": 0,
"columnIndex": 1,
"value": "R1C2"
},
{
"rowIndex": 1,
"columnIndex": 0,
"value": "R2C1"
},
{
"rowIndex": 1,
"columnIndex": 1,
"value": "R2C2"
}
]
}
这篇关于在Java中将guava表值写入文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!