从Map创建番石榴表

时间:2014-07-08 08:46:57

标签: java guava

我有如下所述的地图数据结构。我想把它转换成表格。我正在尝试使用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();
      }
    });
  }
}

2 个答案:

答案 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;
}