2016-03-20 4 views
-1

A HashSetのはIは同じ</p>以下 <pre><code>in this case the elements are ABBA,AABB,BBAA,BAAB so the resultant output should be [ABAB,BABA] </code></pre> <p>として隣接要素を有する要素を削除する必要が

[ABAB,BABA,ABBA,AABB,BBAA,BAAB] 

以下のような要素で構成HashSetのから隣接する文字が重複している要素を削除するコードであります私はAABBとして入力を与えるときにハッシュセットの値を取得するために使用されました

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

を使用したソリューションであるとの問題は何ですか?それは動作しませんか?任意のエラー? – svarog

+0

このコードは[ABAB、BABA、ABBA、AABB、BBAA、BAAB]を返しますが、隣接する重複文字を含まない2つの要素[ABAB、BABA]のみを返すように変更する必要があります。 –

答えて

0

If私はあなたの質問を正しく理解しています。セット内で順列を生成するのに問題はありません。隣接する文字が等しい文字列を特定する場合にのみ助けを求めることになります。それが正しいなら:

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を使用している場合は、1つのステートメントでアイテムを削除するためにこれを使用することができます:

set.removeIf(this::hasAdjacent); 

あなたがセットに追加する前にそうしないと、テストすることができます。

+0

。しかし、この場合、同じ文字を持つハッシュセットの文字列を削除する必要があります –

0

最初にあなたは、文字列は、隣接する同じ文字が含まれているかどうかを確認する方法書くことができます。

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

を、その後、あなたはあなたのセットを経由してのみ「doesnの文字列を返す別のメソッドを記述するために、このメソッドを使用することができますトンのcontaint隣接する同じ文字:あなたはこのようにそれをテストする場合

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のみを出力します。

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] 
} 
+0

使用するコレクタを使用するには? –

+0

@BalajiKarthick 'import java.util.stream.Collectors; ' –

関連する問題