我想在java中“清理”一个ArrayList,这是解释
假设我们有这个列表:
a = ["a_12_b", "a_13_b", "a_13bis_b", "a_14_b", "a_14_new_b"]
在此列表中,“a_13bis_b”
和 “a_14_new_b”
被视为重复项,为什么?因为每个条目都有这个正则表达式:a_“a string with a lenght =2”_b
输出应该是:
a = ["a_12_b", "a_13_b", "a_14_b"]
我使用了这个简单的代码,但它返回错误的输出:
for (int j = 0; j < list.size(); j++) {
//basically clean entry will remove the a_ and _b
String value1= cleanEntry(list.get(j));
for (int k = 0; k < list.size(); k++) {
String value2= cleanEntry(list.get(k));
if (k != j && value1.equalsIgnoreCase(value2)) {
duplicates.add(list.get(k))
list.remove(k);
}
}
}
有什么帮助吗?
最佳答案
您可以使用流映射方法和正则表达式将字符串“规范化”为通用格式,然后创建一组规范化字符串。
类似这样的事情:
List<String> a = Arrays.asList("a_12_b", "a_13_b", "a_13bis_b", "a_14_b", "a_14_new_b");
Set<String> uniques = a.stream()
.map(s -> s.replaceAll("^([a-z]_\\d{2})[^\\d].+(_[a-z])$", "$1$2"))
.collect(Collectors.toSet());
System.out.println(uniques);
打印:
[a_14_b, a_13_b, a_12_b]
Java 7、6 的解决方案:
List<String> a = Arrays.asList("a_12_b", "a_13_b", "a_13bis_b", "a_14_b", "a_14_new_b");
Set<String> set = new LinkedHashSet<>();
for(String s : a) {
set.add(s.replaceAll("^([a-z]_\\d{2})[^\\d].+(_[a-z])$", "$1$2"));
}
System.out.println(set);
结果:
[a_12_b, a_13_b, a_14_b]
如果需要超过 2 个数字字符,可以更改正则表达式。这是一个结果示例:
List<String> a = Arrays.asList("a_12345678901234567890123456_b", "a_13345678901234567890123456_b",
"a_13345678901234567890123456bis_b", "a_14345678901234567890123456_b", "a_14345678901234567890123456_new_b");
Set<String> set = new LinkedHashSet<>();
for(String s : a) {
set.add(s.replaceAll("^([a-z]_\\d{26})[^\\d].+(_[a-z])$", "$1$2"));
}
System.out.println(set);
结果:
[a_12345678901234567890123456_b, a_13345678901234567890123456_b, a_14345678901234567890123456_b]
关于java - java中从ArrayList中删除 "regex duplicates",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44803330/