2014-12-08 5 views
0

Я получаю данные для определенного идентификатора пользователя из 14 таблиц, как показано ниже. В рамках данных, я извлекая user_id, record_name и record_value, а затем я получаю timestamp от record_name (расщеплением на нем), а затем заполнить мой TreeMap с ключом как timestamp и значением как record_value.Как создать структуру данных, которая может содержать 100 самых последних значений record_values ​​в timestamp?

После этого я извлекаю 100 последних record_value от valueTimestampMap, а затем заселяю их в моем 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; 
} 

Я сортировкой TreeMap в порядке ключей убывания с использованием Collections.reverseOrder(), так что у меня есть самые последние метки времени на вершине, а затем я могу просто извлечь 100 последний record_value из это и то, что делает мой выше код.

Постановка задачи: -

У меня есть 100 самых последних record_value в списке recordValueHolder. Теперь мне также нужно выяснить, какие tableNumber каждый record_value из 100 пришло из и что было record_name для этого record_value?

Итак, я думал создать структуру данных, как показано ниже, которая может содержать 100 последних record_value вместе с их номером таблицы, именем записи и временной меткой.

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 последних record_values ​​наряду с другими значениями, а также.

+0

Я немного смущен. но если «timestamp» - это то, на чем вы основываетесь, то «TreeMap» - правильный выбор. каждый раз, когда вы можете вытащить его с наименьшей меткой времени. но если ваша система работает, то «timestamp» можно интерпретировать как время, когда данные поступают, тогда достаточно простого массива длиной в 100 длин, и он быстрее, чем «TreeMap». – HuStmpHrrr

ответ

1

Вместо использования TreeMap<Long, String> используйте TreeMap<Long, RecordValueTimestampTableHolder>

Вместо использования

 valueTimestampMap.put(timestamp, record_value); 

использование:

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

Конечно, это означает, что вам придется добавить конструктор RecordValueTimestampTableHolder что принимает четыре параметра и присваивает их внутренним полям.

Как вы сказали, recordValueHolder должно быть определено как List<RecordValueTimestampTableHolder>, и это также должно быть тип возврата из этого метода.

Заполнение будет таким, как если бы вы его заполнили сейчас. Хотя лично я использовал бы valueTimestampMap.values() для повторения.

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

 Смежные вопросы

  • Нет связанных вопросов^_^