有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中从ArrayList中删除“regex duplicates”

我想用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);
                    }
            }
}

有什么帮助吗


共 (2) 个答案

  1. # 1 楼答案

    你只需在比较前丢弃第二个字符之后的所有字符。 试试这个

    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.substring(0,2).equalsIgnoreCase(value2.substring(0,2))) {
                duplicates.add(list.get(k)) list.remove(k);
            }
        } 
    }
    
  2. # 2 楼答案

    可以使用带有正则表达式的流映射方法将字符串“规格化”为公共格式,然后创建一组规格化字符串

    比如:

    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]

    如果需要两个以上的数字字符,可以更改正则表达式。下面是一个结果示例:

    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]