【发布时间】:2014-12-08 21:23:17
【问题描述】:
我正在从 14 个表中获取特定用户 ID 的数据,如下所示。作为数据的一部分,我正在提取user_id、record_name 和record_value,然后我从record_name 得到timestamp(通过对其进行拆分),然后使用timestamp 的键和值填充我的TreeMap record_value。
之后,我从 valueTimestampMap 中提取 100 个最新的 record_value,然后将其填充到我的 recordValueHolder LinkedList 中。
在我的例子中,最近的 100 种方法是通过查看时间戳而不是它们来的方式。
下面是我的代码-
public List<String> getData(String userId) {
List<String> recordValueHolder = new LinkedList<String>();
Map<Long, String> valueTimestampMap = new TreeMap<Long, String>(Collections.reverseOrder());
for (int tableNumber = 0; tableNumber < 14; tableNumber++) {
String sql = "select * from table_" + tableNumber + " where user_id='" + userId + "';";
SimpleStatement query = new SimpleStatement(sql);
query.setConsistencyLevel(ConsistencyLevel.QUORUM);
ResultSet res = session.execute(query);
Iterator<Row> rows = res.iterator();
while (rows.hasNext()) {
Row r = rows.next();
String user_id = r.getString("user_id"); // get user id
String record_name = r.getString("record_name"); // get record name
String record_value = r.getString("record_value"); // get record value
long timestamp = Long.parseLong(record_name.split("\\.")[1]);
// populate my tree map
valueTimestampMap.put(timestamp, record_value);
}
}
// now extract 100 most recent record_value since
// valueTimestampMap is already sorted basis on key in
// descending order
for (Map.Entry<Long, String> entry : valueTimestampMap.entrySet()) {
if (recordValueHolder.size() > 99)
break;
recordValueHolder.add(entry.getValue());
}
return recordValueHolder;
}
我使用Collections.reverseOrder() 按键的降序对 TreeMap 进行排序,以便我在顶部有最新的时间戳,然后我可以简单地从中提取 100 个最新的record_value,这就是我上面的代码所做的。
问题陈述:-
我在 recordValueHolder 列表中有 100 个最新的 record_value。现在我还需要找出 100 个中每个 record_value 中的哪个 tableNumber 以及那个 record_value 的 record_name 是什么?
所以我想创建一个类似下面的数据结构,它可以保存 100 个最新的record_value 以及它们的 tableNumber、record_name 和时间戳。
public class RecordValueTimestampTableHolder {
private long timestamp;
private String recordName;
private String recordValue;
private Integer tableNumber;
// setters and getters
}
所以List<RecordValueTimestampTableHolder> 的大小应该是 100。这可能与我当前的设置有关吗?我无法理解如何进行这项工作?
现在我的 getData 方法的返回数据类型将改变,而不是返回 List<String>,现在它将返回 List<RecordValueTimestampTableHolder>,其中将包含 100 个最近的记录值以及其他值。
【问题讨论】:
-
我有点困惑。但是如果
timestamp是您的基础,那么TreeMap是一个正确的选择。每次您可以弹出至少timestamp的那个。但是如果你的系统运行时,timestamp可以解释为数据到来的时间,那么一个简单的100长的数组就足够了,而且比TreeMap的方式要快。
标签: java algorithm data-structures map