[英]Java - how to remove duplicates from a collection of timestamps?
我有一個以毫秒為單位的時間戳列表,我想比較它們並刪除不考慮毫秒部分的重復項。 並處理每個獨特的價值。
例如,如果在不截斷毫秒部分的情況下進行比較,則millis2
和millis3
是不同的值( 2:28:14.100
與2:28:14.200
)。 但是我需要忽略毫秒,如果將兩個值截斷為秒比較,它們將被視為重復項。
因此,我決定創建一個時間戳列表,並以相反的順序對其進行排序。 然后遍歷集合,檢查截斷值是否不相等。 並將唯一值添加到List<Long> deduped
。
Long millis0 = 1554052261000L; // Sunday, March 31, 2019 5:11:01 PM
Long millis1 = 1557023292000L; // Sunday, May 5, 2019 2:28:12 AM
Long millis2 = 1557023294100L; // Sunday, May 5, 2019 2:28:14.100 AM
Long millis3 = 1557023294200L; // Sunday, May 5, 2019 2:28:14.200 AM
List<Long> initialTimestamps = Arrays.asList(millis2, millis3, millis0, millis1);
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(initialTimestamps, comparator);
Long prevTs = null;
List<Long> deduped = new ArrayList<>();
for (Long ts: initialTimestamps) {
if (prevTs != null && !millisToSeconds(prevTs).equals(millisToSeconds(ts))) {
deduped.add(prevTs);
process(prevTs)
}
prevTs = ts;
deduped.add(prevTs);
process(prevTs)
}
但是打印出來的內容時deduped
,也有重復:
Deduped timestamps ->
1557023294200
1557023294100
1557023294100
1557023292000
1557023292000
1554052261000
但是我希望在重復數據刪除之后僅1557023294
1557023292
和1554052261
。 我在這里想念什么?
如果可以使用Java 8,則可以使用stream().distinct()
:
public static void main(String[] args) throws Exception {
Long millis0 = 1554052261000L; // Sunday, March 31, 2019 5:11:01 PM
Long millis1 = 1557023292000L; // Sunday, May 5, 2019 2:28:12 AM
Long millis2 = 1557023294100L; // Sunday, May 5, 2019 2:28:14.100 AM
Long millis3 = 1557023294200L; // Sunday, May 5, 2019 2:28:14.200 AM
List<Long> initialTimestamps = Arrays.asList(millis2, millis3, millis0, millis1);
List<Long> unique = initialTimestamps.stream().distinct().collect(Collectors.toList());
System.out.println(unique);
}
對於Java <8,您可以將它們放在Set
:
public static void main(String[] args) throws Exception {
Long millis0 = 100L; // Sunday, March 31, 2019 5:11:01 PM
Long millis1 = 100L; // Sunday, May 5, 2019 2:28:12 AM
Long millis2 = 200L; // Sunday, May 5, 2019 2:28:14.100 AM
Long millis3 = 200L; // Sunday, May 5, 2019 2:28:14.200 AM
List<Long> initialTimestamps = Arrays.asList(millis2, millis3, millis0, millis1);
Set<Long> unique = new HashSet<Long>(initialTimestamps);
System.out.println(unique);
}
根據您忽略毫秒的要求,如果您不關心毫秒,則可以使用Map
(如果要保留毫秒)或使用上述方法之一。 在這種情況下,只需將值除以1_000
public static void main(String[] args) throws Exception {
Long millis0 = 1554052261000L; // Sunday, March 31, 2019 5:11:01 PM
Long millis1 = 1557023292000L; // Sunday, May 5, 2019 2:28:12 AM
Long millis2 = 1557023294100L; // Sunday, May 5, 2019 2:28:14.100 AM
Long millis3 = 1557023294200L; // Sunday, May 5, 2019 2:28:14.200 AM
List<Long> initialTimestamps = Arrays.asList(millis2, millis3, millis0, millis1);
Map<Long, Long> unique = new HashMap<>();
for (Long timestamp : initialTimestamps) {
unique.put(timestamp / 1000, timestamp);
}
System.out.println(unique.values());
}
如果要保留每個重復項的第一個值,請使用
if (!unique.containsKey(timestamp / 1000)) {
unique.put(timestamp / 1000, timestamp);
}
而不只是put()
。 如果要保留所有時間戳的初始順序,則應使用LinkedHashMap
而不是HashMap
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.