按特定表列的值获取所有键

时间:2015-12-04 12:04:27

标签: java

我在Java中有一个表格数据表示。 到目前为止,我使用Google Guava将数据保存在Table<R,C,V>

鉴于此表

|----------------------------------------------|
| Artist          | Genre    | Type            |
|----------------------------------------------|
| Eddie Van Halen | Musician | Hard Rock       |
| David Bowie     | Musician | Art Pop         |
| David Lynch     | Director | Surrealist Film |
| George Lucas    | Director | Blockbuster     |
|----------------------------------------------|

我用这个

Table<String, String, String> table = HashBasedTable.create();
table.put("Eddie Van Halen", "Genre", "Musician");
table.put("Eddie Van Halen", "Type",  "Hard Rock");

table.put("David Bowie", "Genre", "Musician");
table.put("David Bowie", "Type",  "Art Pop");

table.put("David Lynch", "Genre", "Director");
table.put("David Lynch", "Type",  "Surrealist Film");

table.put("George Lucas", "Genre", "Director");
table.put("George Lucas", "Type",  "Blockbuster");

创建表对象。

使用行或列键很容易获取数据。 所以我可能会得到David Bowie的类型:

table.get("David Bowie", "Genre"); // "Musician"

此外,我可以获取特定列的所有数据:

table.column("Genre").values(); // [Musician, Director, Musician, Director]

我的主要兴趣是检索所有艺术家,他们是导演。在这种情况下,它是按值查找。这里有二维地图,例如来自Apache Collections的BidiMap或来自Google Guava的BiMap

但是,有哪些实现有助于按表格数据的值获取一组行键?

我很想找到像

这样的东西
Set<R> table.getRowsByValue( C columnKey, V value )

这应该会产生类似的结果:

table.getRowsByValue("Genre", "Musician"); // [David Bowie, Eddie Van Halen]

更新1

正如我之前提到的,有Map实现,允许按给定值检索密钥 我试着用它们:

    BidiMap bidiMap = new DualHashBidiMap<String,String>(table.column("Genre")); 
    bidiMap.getKey("Musician"); // "David Bowie"

Apache Colletions方式 - 只返回最后一个元素。

    BiMap biMap = HashBiMap.create(table.column("Genre"));
    biMap.inverse().get("Musician");

Google Guava的BiMap引发了一个(冗长的)异常:

java.lang.IllegalArgumentException: value already present: Musician

1 个答案:

答案 0 :(得分:0)

使用常规地图,我会迭代Map.entrySet(),然后拉Map.Entry.getKey()。

这里你似乎能够迭代cellSet() 返回Set<Table.Cell<R,C,V>>

在java 8中

(希望没有拼写错误,我没试过):

table.cellSet().stream()
   .filter(tc -> tc.getColumnKey().equals("Director"))
   .collect(Collectors.toList());