我有以下列格式存在的單個用戶的日志條目:[unique id], [start time],[ end time]因此,在以下示例條目中:1,1100,12002,1030,11303,1420,15004,1519,1700查找會話,即將日志條目分組為“會話”。確定會話的條件是:如果兩個條目時間跨度重疊,則它們屬于同一會話。或者如果不重疊,但在 < 30 之間的差距,那么它們屬于同一個會話。示例:輸出應如下所示:Session 1: 1, 2Session 2: 3, 4我在想的邏輯是:解析字符串并將其加載到“LogEntries”類中。根據“startTime”對“條目”集合進行排序。我有“LogEntries”類實現了“Comparable”接口?,F在迭代“條目”集合并獲得所需的輸出。輸出將是一個字符串列表,其中每個字符串將用逗號分隔。我想出了下面的代碼,但我對如何處理上面的第 3 點邏輯感到困惑。 private static List<String> groupSessions(List<String> inputs) { List<String> output = new ArrayList<>(); List<LogEntries> entries = new ArrayList<>(); for (String input : inputs) { String[] arr = input.split(","); LogEntries entry = new LogEntries(Integer.parseInt(arr[0]), Integer.parseInt(arr[1]), Integer.parseInt(arr[2])); entries.add(entry); } // sort it basis on startTime Collections.sort(entries); // now iterate the entries list - this is where I am confuse for (int i = 0; i < entries.size(); i++) { // do some stuff } return output; }
1 回答

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
一些想法:
您將時間戳表示為 int/Integer 值。這允許簡單的排序,但會使以后的計算變得更加困難(比如更難獲得兩個時間戳之間的增量)。您可以考慮創建一個不同的類來表示這些小時:分鐘值。
解決你的任務:首先在一張紙上做。以您的輸入示例為例,首先根據開始時間對該列表進行排序。
查看排序的時間戳,查看第一個條目。顯然,這必須是會話的開始?,F在您只需查看第一個條目的結束時間和后續條目的開始時間。重疊?然后第一個會話繼續到第二個條目的結束時間。沒有重疊,然后您計算“開始時間(秒) - 首先結束時間”。小于30分鐘?會話繼續,因此您再次與下一個結束時間進行比較。否則,會話結束,下一個條目是下一個會話的開始。重復。
長話短說:您必須首先開發告訴您如何確定會話的算法。然后,您將該指令序列轉換為代碼。關鍵是首先從概念上將大問題分解成最小的部分,然后看看如何將它們組合在一起。
添加回答
舉報
0/150
提交
取消