2014-07-08 2 views
2

다음과 같이지도 데이터 구조가 있습니다. 이것을 표로 변환하고 싶습니다. 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

documentationTables.newCustomTable의 분명히 말한다 :

Throws: 
IllegalArgumentException - if backingMap is not empty 

그래서 당신은 빈지도를 제공해야하지만 일부 데이터로 가득 찼다. 의견에 따라

편집 :

테이블보기에지도를 포함하는 이미 데이터를 변환하지 않습니다 Tables.newCustomTable 방법. 그것은 underyling 맵을 만들 때 더 많은 사용자 정의 동작을 위해 사용됩니다. 실제로 Tables.newCustomTable 메서드는 행과 열에 대해 만들어야하는 구체적인 유형의 맵을보다 많이 제어 할 수 있습니다. 예를 들어, 다음과 같이 사용할 수 있습니다 : 나는 열에 대한 행에 대한 TreeMapLinkedHashMap을 사용

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

참고. 다음과 같은 그 동작을하지 않아도 대부분의 경우

(. 나는 그런데, Comparable를 확장하는 유형 매개 변수 R을 제한 할 필요) 따라서 당신은 당신의 방법을 쓸 수 있습니다 :

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; 
} 
+0

internalMap이 비어 있어야한다는 뜻입니까? – user3222372

+0

필자가 생각하기에, 변수'data'에 의해 참조 된 맵을 (따라서 toTable 매개 변수로 참조하는) _data supplies_ map으로 원했습니다. 즉, 공급자를 다시 작성해야합니다. 반대의 경우도 마찬가지입니다 :'Maps.newLinkedHashMap()'으로 생성 한 빈지도는 첫 번째 인수로 놓아야합니다. – Seelenvirtuose

+0

코드 스 니펫을 도울 수 있습니까? 도움이 될 것입니다. 감사. – user3222372

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