从散列集中删除具有重复相邻字符的元素

时间:2016-03-20 09:34:23

标签: java hashset

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;
}

3 个答案:

答案 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);
}

然后它仅输出ABABBABA

答案 2 :(得分:0)

如果您确定String仅包含AB,则可以使用以下内容。

set.removeIf(x -> x.contains("AA") || x.contains("BB"));

否则,这是使用

的解决方案
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]
}