需求背景

XX需求,批量输入域名的时候,需要对域名字符串进行分隔,并去重,同时分隔后统一使用换行符进行保存,便于下一次批量展示

输入

www.baidu.com fdas.com  google.com   www.baidu.com;
gool.com

预期结果

www.baidu.com
fdas.com
google.com
gool.com

代码

    /**
     * 对使用(,; \n) 逗号、分号,空格,换行符隔开的字符串进行分隔,去重后并统一使用换行符进行分隔
     * @param domains 
     * @return
     */
    public String  filterDuplicatedDomains(String domains) {
        Set<String> set = new LinkedHashSet<>();
        if (Strings.isNullOrEmpty(domains)) {
            return "";
        }
        StringBuffer domain = new StringBuffer();
        StringBuffer newDomains = new StringBuffer();

        //O(n)复杂度扫描
        for (int i = 0; i < domains.length(); i++) {
            char c = domains.charAt(i);
            if (c == '\n' || c == ',' || c == ';' || c == ' ') {
                if (domain.length() != 0){
                    if(set.add(domain.toString())){
                        newDomains.append(domain).append("\n");
                    }
                    domain.setLength(0);
                }
            }else{
                domain.append(c);
            }
        }

        //最后一个有效的域名
        if (domain.length() != 0){
            if(set.add(domain.toString())){
                newDomains.append(domain).append("\n");
            }
        }
        //去掉最后一个换行符
        if (newDomains.length() != 0){
            newDomains.deleteCharAt(newDomains.length()-1);
        }
        return newDomains.toString();
    }

描述

这段代码实现了去重字符串中的域名,具体实现如下:

  1. 将字符串domains转换成字符数组遍历,用domain保存遍历过程中的域名。
  2. 如果遍历到的字符是换行符、逗号、分号或者空格,则表示domain中已经保存了一个完整的域名,将其加入到set集合中进行去重操作,同时将其加入到newDomains中保存。
  3. 如果遍历到的字符不是上述特殊字符,则表示其属于当前域名的一部分,将其加入到domain中。
  4. 最后需要特殊处理最后一个域名,因为它没有特殊字符分割,需要单独处理。
  5. 返回去重后的字符串。

需要注意的是,这段代码的时间复杂度为O(n),其中n为字符串的长度,因此对于大字符串的处理效率比较高。同时,使用LinkedHashSet实现去重操作可以保证元素插入和输出的顺序一致。