【问题标题】:Sorting Guava table on values根据值对 Guava 表进行排序
【发布时间】:2012-06-29 06:06:19
【问题描述】:

有没有办法做到这一点?预期效果是 rowMap 和 columnMap 条目值将按值排序。

问题是如果没有表中的基础映射,我无法创建比较器。

Table table = TreeBasedTable.create(?,?);

Map<String, Map<String, String>> rowMap = table.rowMap();
Map<String, String> thisMapShouldBeSortedByValues = rowMap.get(smth);

Map<String, Map<String, String>> columnMap = table.columnMap();
Map<String, String> thisMapShouldBeSortedByValues = columnMap.get(smth);

现在我总是必须事后对 rowMap 和 columnMap 进行排序并在其上分配新的 TreeMap。

【问题讨论】:

    标签: java guava comparator


    【解决方案1】:

    首先,我假设thisMapShouldBeSortedByValues,你的意思是thisMapShouldBeSortedByKeys

    TreeBasedTable 扩展了 RowSortedTable,因此该表仅按行排序,而不是按列排序。调用table.columnMap() 会给你一个无序的Map&lt;C, Map&lt;R, V&gt;

    因为它是按行排序的,所以table.rowMap 返回一个SortedMap&lt;R, Map&lt;C, V&gt;&gt;。所以地图是按它的行键排序的,但是Map&lt;C, V&gt; 值是一个未排序的地图,因此为什么对rowMap.get() 的调用会返回一个无序的地图。

    您尝试通过调用 table.rowMap() 和 rowMap.get() 获取的 SortedMap 可以通过像这样调用 table.rowKeySet() 和 table.row(R rowKey) 来获得(您构建你原本想通过调用table.rowMap()获得的地图:

    ImmutableSortedMap.Builder<String, SortedMap<String, String>> builder = ImmutableSortedMap.builder();
    
    for (String rowKey : table.rowKeySet()){
         builder.put(rowKey, table.row(rowKey)) ;
    }
    
     SortedMap<String, <SortedMap<String, String>> thisMapIsSortedByKeys = builder.build();
    

    【讨论】:

    • 我认为说TreeBasedTable不按列排序是不对的。它按行排序,每行中的单元格进一步按列排序。正如code.google.com/p/guava-libraries/wiki/… 所说,“TreeBasedTable,本质上是由 TreeMap> 支持的”
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2015-01-05
    • 1970-01-01
    • 2020-01-10
    • 2020-06-02
    相关资源
    最近更新 更多