字符串去重并统一使用换行符进行分隔
需求背景
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();
}
描述
这段代码实现了去重字符串中的域名,具体实现如下:
- 将字符串domains转换成字符数组遍历,用domain保存遍历过程中的域名。
- 如果遍历到的字符是换行符、逗号、分号或者空格,则表示domain中已经保存了一个完整的域名,将其加入到set集合中进行去重操作,同时将其加入到newDomains中保存。
- 如果遍历到的字符不是上述特殊字符,则表示其属于当前域名的一部分,将其加入到domain中。
- 最后需要特殊处理最后一个域名,因为它没有特殊字符分割,需要单独处理。
- 返回去重后的字符串。
需要注意的是,这段代码的时间复杂度为O(n),其中n为字符串的长度,因此对于大字符串的处理效率比较高。同时,使用LinkedHashSet实现去重操作可以保证元素插入和输出的顺序一致。