我的字符串值为|| HelpDesk || IT人员|| IT人员||管理员||审核|| HelpDesk ||
我正在尝试编写应该删除重复项的代码并返回保留像这样的demiliters的唯一值|| HelpDesk || IT人员||管理员||审核||
我的代码使用HashSet删除重复项,但问题是它是删除分隔符。如何通过仅删除重复值来保留分隔符。
删除重复项并添加后退分隔符后,下面是我的代码。但不确定是否有简单的方法可以做到这一点。
public static void main(String[] args) {
TestDuplicates testDuplicates = new TestDuplicates();
String bRole = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
List<String> listWithoutDuplicates = new ArrayList<String>();
String noDup = "";
List<String> splittedStringList =
new ArrayList<String>();
SplitOperations splitOperations =
new SplitOperations();
splittedStringList =
splitOperations.splitString(bRole);
for (int i = 0; i < splittedStringList.size(); i++) {
HashSet<String> listToSet = new HashSet<String>(splittedStringList);
listWithoutDuplicates = new ArrayList<String>(listToSet);
}
for(int i=0;i<listWithoutDuplicates.size();i++){
noDup = noDup + "||"+listWithoutDuplicates.get(i);
System.out.println(listWithoutDuplicates.get(i));
}
System.out.println("No Duplicate is::"+ noDup+"||");
}
由于
答案 0 :(得分:1)
您可以使用LinkedHashSet
来保留广告订单。用“||”拆分字符串后只需在构造String时添加分隔符。
String s = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
Set<String> set = new LinkedHashSet<>(Arrays.asList(s.split(Pattern.quote("||"))));
String noDup = "||";
for(String st : set) {
if(st.isEmpty()) continue;
noDup += st+"||";
}
或者使用新的java 8 Stream API:
String noDup = "||"+
Arrays.stream(s.split(Pattern.quote("||")))
.distinct()
.filter(st -> !st.isEmpty()) //we need to remove the empty String produced by the split
.collect(Collectors.joining("||"))+"||";
两种方法都会产生相同的结果(||HelpDesk||IT Staff||Admin||Audit||
)。
答案 1 :(得分:0)
public String removeDublicate () {
String str = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
String split[] = str.split("\\|\\|");
String newStr = "";
for (String s : split) {
if (!s.isEmpty() && !newStr.contains(s)) {
newStr += "||" + s;
}
}
newStr += "||";
return newStr;
}
那样的东西? str
可能是一个争论。
编辑#1
如果您想摆脱&& !newStr.contains(s)
,可以改用HashSet<String>
。我认为这样做太过分了。当字符串很小时,.contains(s)
会执行此操作。
答案 2 :(得分:0)
这应该可行,如果你愿意,它也会保持元素序列。请注意,我还没有编写代码来重新分隔分隔符。
public static void main(String s[]){
String a = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
a = a.replaceAll("\\|\\|",",");
String arr[] = a.split(",");
//linked hash set in case you want to maintain the sequence of elements
Set<String> set = new LinkedHashSet<String>(Arrays.asList(arr));
set.remove("");
System.out.println(set);
//Iterate through the set and put your delimiters here again
}
答案 3 :(得分:0)
这是一个基于正则表达式的一个班轮:
str = str.replaceAll("(\\|[^|]+)(?=.*\\1\\|)", "");
这可以通过使用后向引用的前瞻断言替换每个后面的任何术语。
这是一个非正则表达式java 8 one liner:
Arrays.stream(str.substring(1).split("[|]")).distinct().collect(Collectors.joining("|", "|", "|"));
答案 4 :(得分:0)
使用Guava lib它是一个单行:
Joiner.on("||").skipNulls(Splitter.on("||").trimResults().split(<target_string>);)
以下是我的尝试:
import java.util.*;
public class Seperator {
public static void main(String[] args) {
String bRole = "||HelpDesk||IT Staff||IT Staff||Admin||Audit||HelpDesk||";
List<String> listWithoutDuplicates = new ArrayList<String>();
String noDup = "";
List<String> splittedStringList = new ArrayList<String>();
splittedStringList = Arrays.asList(bRole.split("\\|\\|"));
LinkedHashSet<String> listToSet = new LinkedHashSet<String>(splittedStringList);
noDup = Seperator.join(listToSet, "||");
System.out.println("No Duplicate is::"+ noDup+"||");
}
public static String join(Set<String> set, String sep) {
String result = null;
if(set != null) {
StringBuilder sb = new StringBuilder();
Iterator<String> it = set.iterator();
if(it.hasNext()) {
sb.append(it.next());
}
while(it.hasNext()) {
sb.append(sep).append(it.next());
}
result = sb.toString();
}
return result;
}
}
LinkedHashSet主要用于保存顺序和当前获取唯一元素。加入是非常标准的,但我们也可以使用Google's Guava Library(Joiner):
所以,而不是Seperator.join(listToSet, "||");
您将拥有:Joiner.on("||").join(listToSet);