gpt4 book ai didi

java - 如何根据前 10 位数字查找重复值?

转载 作者:行者123 更新时间:2023-11-29 04:07:50 30 4
gpt4 key购买 nike

我有一个场景,我有一个列表如下:

List<String> a1 = new ArrayList<String>();  
a1.add("1070045028000");
a1.add("1070045028001");
a1.add("1070045052000");
a1.add("1070045086000");
a1.add("1070045052001");
a1.add("1070045089000");

我在下面尝试查找重复元素,但它会检查整个字符串而不是部分字符串(前 10 位数字)。

for (String s:al){
if(!unique.add(s)){
System.out.println(s);
}
}

是否有任何可能的方法根据数字的前 10 位数字识别所有重复项,然后通过比较重复项找到最小的字符串并将其添加到另一个列表?

注意:另外,每个 10 位字符串代码始终只有 2 个重复!!

最佳答案

您可以按 (String s) -> s.substring(0, 10) 分组

Map<String, List<String>> map = list.stream()
.collect(Collectors.groupingBy(s -> s.substring(0, 10)));

map.values()会给你Collection<List<String>>每个List<String>是重复列表。

{
1070045028=[1070045028000, 1070045028001],
1070045089=[1070045089000],
1070045086=[1070045086000],
1070045052=[1070045052000, 1070045052001]
}

如果是单元素列表,没有发现重复项,可以过滤掉这些条目。

{
1070045028=[1070045028000, 1070045028001],
1070045052=[1070045052000, 1070045052001]
}

然后问题归结为将值列表减少为单个值。

[1070045028000, 1070045028001] -> 1070045028000

我们知道前10个符号是相同的,比较时可以忽略它们。

[1070045028000, 1070045028001] -> [000, 001]

它们还是生的String值,我们可以将它们转换为数字。

[000, 001] -> [0, 1]

天然 Comparator<Integer>会给 0作为最小值。

0
0 -> 000 -> 1070045028000

map.values() 中的所有列表重复此操作你就完成了。

代码是

List<String> result = map
.values()
.stream()
.filter(list -> list.size() > 1)
.map(l -> l.stream().min(Comparator.comparingInt(s -> Integer.valueOf(s.substring(10)))).get())
.collect(Collectors.toList());

关于java - 如何根据前 10 位数字查找重复值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57188755/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com