java - Java - 如何从时间戳集合中删除重复项?
问题描述
我有一个以毫秒为单位的时间戳列表,我想比较它们并删除不考虑毫秒部分的重复项。并处理每个唯一值。
例如,如果在不截断毫秒部分( vs )的情况下进行比较,则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);
}
更新
根据您忽略毫秒的要求,您可以使用 a 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
推荐阅读
- html - Firefox中的这个假伪元素是什么?
- amazon-web-services - 无法获取子网 ID | 地形规划
- java - Spring Boot gRPC:发生业务错误时如何返回错误码?
- jakarta-ee - 如何分离 eclipselink 加载的实体以通过 jaxb 或 yasson 对其进行序列化?
- python - 我有两组数据,排列在两列中。dataM 有一些点与 dataS 匹配;如何找到它们匹配的行?
- serenity-bdd - 如何为特定测试类重置 serenity.property 重启浏览器
- c++ - 如何从 C++ 构造 Nan::FunctionCallbackInfo 对象
- web - 如何在单页应用程序中使用 Active Directory 实现单点登录?
- function - ZSH Alias 会触发终端通知程序,但不会触发生成它的命令
- sql-server - 如何从单个 SQL 脚本创建 dacpac