按值查询番石榴表

时间:2017-06-11 12:16:04

标签: java collections guava

我正在从CSV文件创建一个表格,其中的数据包含不同项目的用户评分dataset

我使用以下代码填写表

Reader in = new FileReader(OriginalRatingDataPath);
Iterable<CSVRecord> records = CSVFormat.EXCEL.withHeader().parse(in);

Table<Integer,Integer,Integer> ratings = HashBasedTable.create();
for (CSVRecord record : records) {
    ratings.put(Integer.parseInt(record.get("userID")),Integer.parseInt(record.get("itemID")),Integer.parseInt(record.get("rating")));
}

如何查询表格以获得评分为3到5的用户?

1 个答案:

答案 0 :(得分:1)

选项1

表的要点是允许您通过Row或Column访问记录。因此,如果您需要通过评级进行访问,最简单的方法是将评级用作列。

Reader in = new FileReader(OriginalRatingDataPath);
Iterable<CSVRecord> records = CSVFormat.EXCEL.withHeader().parse(in);

Table<Integer,Integer,Integer> ratings = HashBasedTable.create();
for (CSVRecord record : records) {
    ratings.put(Integer.parseInt(record.get("userID")), Integer.parseInt(record.get("rating")), Integer.parseInt(record.get("itemID")));
}

// Copy column 3 to a new map to prevent editing the table itself
// when adding columns 4 and 5 - in turn preventing a memory leak
// from indirectly holding onto `ratings` through the map
Map<Integer, Integer> usersToItemId = new HashMap<>(ratings.column(3));
usersToItemId.putAll(ratings.column(4));
usersToItemId.putAll(ratings.column(5));

// To get just User IDs
Set<Integer> userIds = usersToItemId.keySet();

选项2

如果您的大部分操作都是itemIDuserID访问该表,您可能不想对该列进行评分。在这种情况下,您可以使用cellSet方法并手动迭代表。它的性能不会那么好,但它会起作用。

// Your current code

Set<Integer> userIds = new HashSet<>();
for (Table.Cell<Integer, Integer, Integer> cell : ratings.cellSet()) {
    if (3 <= cell.getValue() && cell.getValue() <= 5) {
        userIds.add(cell.getRowKey());
    }
}