我正在从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的用户?
答案 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
如果您的大部分操作都是itemID
和userID
访问该表,您可能不想对该列进行评分。在这种情况下,您可以使用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());
}
}