Hashset由以下元素组成
[ABAB,BABA,ABBA,AABB,BBAA,BAAB]
我需要删除具有相同元素的元素
in this case the elements are ABBA,AABB,BBAA,BAAB
so the resultant output should be [ABAB,BABA]
下面是我在输入AABB时用来获取Hashset值的代码
public static Set<String> crunchifyPermutation(String str) {
Set<String> crunchifyResult = new HashSet<String>();
if (str == null) {
return null;
} else if (str.length() == 0) {
crunchifyResult.add("");
return crunchifyResult;
}
char firstChar = str.charAt(0);
String rem = str.substring(1);
Set<String> words = crunchifyPermutation(rem);
for (String newString : words) {
for (int i = 0; i <= newString.length(); i++) {
crunchifyResult.add(crunchifyCharAdd(newString, firstChar, i));
}
}
return crunchifyResult;
}
public static String crunchifyCharAdd(String str, char c, int j) {
String first = str.substring(0, j);
String last = str.substring(j);
return first + c + last;
}
答案 0 :(得分:0)
如果我正确理解了您的问题,那么在集合中生成排列没有任何问题。您只需要帮助识别具有相同相邻字符的字符串。如果那是正确的话:
private boolean hasAdjacent(String value) {
for (int i = 1; i < value.length(); i++) {
if (value.charAt(i) == value.charAt(i-1))
return true;
}
return false;
}
如果您使用的是Java 8,则可以使用它来删除一个语句中的项目:
set.removeIf(this::hasAdjacent);
否则,您可以在添加到集合之前进行测试。
答案 1 :(得分:0)
首先,您可以编写检查String是否包含相邻字符的方法:
private boolean containsAdjacent(String s) {
for(int i = 0; i < s.length()-1; i++) {
if(s.charAt(i) == s.charAt(i+1)) return true;
}
return false;
}
之后你可以使用这个方法编写另一个遍历你的集合的方法,只返回不包含相邻字符的字符串:
private Set<String> work(Set<String> set) {
Set<String> result = new HashSet<String>();
for(String s : set) {
if(!containsAdjacent(s)) result.add(s);
}
return result;
}
如果你这样测试:
Set<String> mySet = new HashSet<String>();
mySet.add("ABAB");
mySet.add("BABA");
mySet.add("ABBA");
mySet.add("AABB");
mySet.add("BBAA");
mySet.add("BAAB");
Set<String> noAdjacents = work(mySet);
for(String s : noAdjacents) {
System.out.println(s);
}
然后它仅输出ABAB
和BABA
。
答案 2 :(得分:0)
如果您确定String
仅包含A
和B
,则可以使用以下内容。
set.removeIf(x -> x.contains("AA") || x.contains("BB"));
否则,这是使用java-8
的解决方案public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("ABAB");
set.add("BABA");
set.add("ABBA");
set.add("AABB");
set.add("BBAA");
set.add("BAAB");
System.out.println(set); // [BABA, ABAB, ABBA, AABB, BAAB, BBAA]
set.removeIf(x -> {
for (int i = 0 ; i < x.length() - 1 ; i++){
if (x.charAt(i) == x.charAt(i+1)) {
return true;
}
}
return false;});
System.out.println(set); // [BABA, ABAB]
}