我有如下所述的地图数据结构。我想把它转换成表格。我正在尝试使用Tables.newCustomTable()
方法实现此目的但是低于错误。
Exception in thread "main" java.lang.IllegalArgumentException
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:111)
at com.google.common.collect.Tables.newCustomTable(Tables.java:299)
守则是:
public class TestClass {
public static void main(String[] args) {
Map<Integer, Map<Integer, String>> data = Maps.newHashMap();
Map<Integer, String> internalMap = Maps.newHashMap();
internalMap.put(1, "A");
internalMap.put(2, "B");
internalMap.put(3, "C");
data.put(1, internalMap);
data.put(2, internalMap);
data.put(3, internalMap);
Table<Integer, Integer, String> table = table(data);
System.out.println(table);
}
public static <R, C, V> Table<R, C, V> table(Map<R, Map<C, V>> toTable) {
return Tables.newCustomTable(toTable, new Supplier<Map<C, V>>() {
@Override
public Map<C, V> get() {
return Maps.newLinkedHashMap();
}
});
}
}
答案 0 :(得分:2)
Tables.newCustomTable
的{{3}}清楚地说:
Throws:
IllegalArgumentException - if backingMap is not empty
所以你必须提供一张空地图,但是你填写了一些数据。
根据评论编辑:
方法Tables.newCustomTable
不会将已包含数据的地图转换为表格视图。在创建底层映射时,它用于更自定义的行为。事实上,方法Tables.newCustomTable
只能更好地控制应为行和列创建的具体类型的地图。例如,它可以用作以下内容:
public static <R extends Comparable<R>, C, V> Table<R, C, V> createTable() {
return Tables.newCustomTable(Maps.newTreeMap(), new Supplier<Map<C, V>>() {
@Override
public Map<C, V> get() {
return Maps.newLinkedHashMap();
}
});
}
请注意,我使用TreeMap
表示行,LinkedHashMap
表示列。 (顺便说一句,我需要约束类型参数R以扩展Comparable
。)
在大多数情况下,您不需要这种行为,因此您可以按如下方式编写方法:
public static <R, C, V> Table<R, C, V> table(Map<R, Map<C, V>> fromTable)
{
Table<R, C, V> table = HashBasedTable.create();
for (R rowKey : fromTable.keySet())
{
Map<C, V> rowMap = fromTable.get(rowKey);
for (C columnKey : rowMap.keySet())
{
V value = rowMap.get(columnKey);
table.put(rowKey, columnKey, value);
}
}
return table;
}
答案 1 :(得分:1)
public static <R, C, V> Table<R, C, V> table(Map<R, Map<C, V>> fromTable)
{
Table<R, C, V> table = HashBasedTable.create();
for (R rowKey : fromTable.keySet())
{
Map<C, V> rowMap = fromTable.get(rowKey);
for (C columnKey : rowMap.keySet())
{
V value = rowMap.get(columnKey);
table.put(rowKey, columnKey, value);
}
}
return table;
}