我在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]
正如我之前提到的,有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
答案 0 :(得分:0)
使用常规地图,我会迭代Map.entrySet(),然后拉Map.Entry.getKey()。
这里你似乎能够迭代cellSet()
返回Set<Table.Cell<R,C,V>>
(希望没有拼写错误,我没试过):
table.cellSet().stream()
.filter(tc -> tc.getColumnKey().equals("Director"))
.collect(Collectors.toList());