【问题标题】:How to make a data structure which can hold 100 most recent record_values basis on timestamp?如何制作一个可以根据时间戳保存 100 个最新记录值的数据结构?
【发布时间】:2014-12-08 21:23:17
【问题描述】:

我正在从 14 个表中获取特定用户 ID 的数据,如下所示。作为数据的一部分,我正在提取user_idrecord_namerecord_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_valuerecord_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&lt;RecordValueTimestampTableHolder&gt; 的大小应该是 100。这可能与我当前的设置有关吗?我无法理解如何进行这项工作?

现在我的 getData 方法的返回数据类型将改变,而不是返回 List&lt;String&gt;,现在它将返回 List&lt;RecordValueTimestampTableHolder&gt;,其中将包含 100 个最近的记录值以及其他值。

【问题讨论】:

  • 我有点困惑。但是如果timestamp 是您的基础,那么TreeMap 是一个正确的选择。每次您可以弹出至少timestamp 的那个。但是如果你的系统运行时,timestamp可以解释为数据到来的时间,那么一个简单的100长的数组就足够了,而且比TreeMap的方式要快。

标签: java algorithm data-structures map


【解决方案1】:

不要使用TreeMap&lt;Long, String&gt;,而是使用TreeMap&lt;Long, RecordValueTimestampTableHolder&gt;

而不是使用

        valueTimestampMap.put(timestamp, record_value);

使用:

        valueTimestampMap.put(timestamp, new RecordValueTimestampTableHolder(timestamp, record_name, record_value, tableNumber));

当然,这意味着您必须向RecordValueTimestampTableHolder 添加一个构造函数,该构造函数接受四个参数并将它们分配给内部字段。

正如你所说,recordValueHolder 必须定义为 List&lt;RecordValueTimestampTableHolder&gt;,并且这也必须是此方法的返回类型。

填充它就像你现在填充它一样。虽然我个人会使用valueTimestampMap.values() 进行迭代。

int i = 0;
for (RecordValueTimestampTableHolder item : valueTimestampMap.values()) {
    recordValueHolder.add(item);
    if (++i == 100)
        break;
}  

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 2020-07-30
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多