0
private String removeDuplicates(String userKeyword){
    int wordLength = userKeyword.length();
    int lengthCounter;
    for (lengthCounter=0; lengthCounter<wordLength; lengthCounter++){
        if (userKeyword.charAt(lengthCounter) != userKeyword.charAt(lengthCounter + 1)){
            String revisedKeyword = "" + userKeyword.charAt(lengthCounter);
            userKeyword = revisedKeyword;
        } 
    }
    return userKeyword;
}

私はJavaが初めてです。String ビルダー、Strung バッファ、Array などはまだ使用していません.... ループも使用していませんが、これが最も簡単な使用方法になると思います... 助けてください。

4

8 に答える 8

4

これを行う方法は無限にあります。確立したツールセットの範囲内で独自のソリューションを見つけることが、プログラミングを学ぶことのすべてです。考えさせられる解決策の 1 つを次に示します。

デフォルトでは一意の値のみを保持できるセットを作成します

Set<Character> mySet = new HashSet<Character>();

次に、文字列内の文字をループし、それぞれを mySet に追加します

mySet.add(c);

完了すると、セットには一意の文字のリストがあり、順番に印刷できます

for (char c : mySet) {
    System.out.println(c)
}

編集:

ネストされたループを使用した簡単なセットアップを次に示します。

String s = "einstein"; //This is the word you will look for duplicates in
String temp = ""; //In this string, you will add characters that are not duplicates
boolean isDuplicate = false; //This will reset every out iteration

物事を単純にするために、難しい例を使用しています。String は空で始まることを理解してくださいtemp。ただし、プロセス全体が完了すると、temp重複することなく einstein と同じ文字を持つことが目標になります。何かのようなものstein

public static void main (String[] args) {

    String s = "einstein";
    String temp = "";
    boolean isDuplicate = false;

    for (int i = 0; i < s.length(); i++) {
        isDuplicate = false;
        char comparisonChar = s.charAt(i);
        for (int j = i + 1; j < s.length(); j++) {
            char nextChar = s.charAt(j);
            if (comparisonChar == nextChar) isDuplicate = true;
        }
        if (!isDuplicate) temp = temp + comparisonChar;
    }

    System.out.println(temp); //should print `stein`
}

}

今はこれをテストしていないので、バグがある可能性がありますが、精神的に通り抜けて理解しようとします. 困ったときは聞いてください。

于 2013-08-10T00:13:45.393 に答える
0
class Twice_Occuring
{
    void main(String s)
    {
        int count=0;
        for(int i=0;i<s.length();i++)
        {
            char c=s.charAt(i);
            int ind1=s.indexOf(c,i);
            int ind2=s.indexOf(c,i+1);
            if(ind2-ind1==1)
            {
                System.out.print(c+" ");
                count++;
            }
        }
        System.out.println("\n Number of counts = "+count);
    }
}
于 2014-10-04T18:03:32.733 に答える
0

以下は、文字列内の重複した文字を削除する私のお気に入りの 2 つの方法です。

最初のものは StringBuffer または StringBuilder を使用しません。contains() のみを使用します。

private static String removeDup(String str){
    String result = new String("");

    for (int i = 0; i < str.length(); i++) {
        if (!result.contains("" + str.charAt(i))) {
            result += "" + str.charAt(i);
        }
    }

    return result;
}

また、StringBuffer または StringBuilder が許可されている場合、コードはさらにクリーンでシンプルになる可能性があります。これが StringBuilder を使用する 2 番目の方法です。

private static String removeDup(String str){
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i<str.length();i++){
        String si = str.substring(i, i+1);
        if (sb.indexOf(si)==-1){
            sb.append (si);
        }
    }
    return sb.toString();
}

もちろん、 set を使用してこの関数を実装することも良い解決策です。コンはこのスレッドで素晴らしい仕事をしました。

于 2013-11-13T18:16:13.543 に答える
0

さて、私はあなたが使用しようとしていたアプローチを見ることができます. まず、「重複を取り除く」というと、隣接する重複だけを取り除くということですか?つまり、「bookkeeper」を「bokeper」に変更したいのですが、「abcabcabc」は変更されません。2番目の「abc」だけを返したい場合は、アプローチ全体が間違っています。

互いに隣り合っている重複だけを削除したいと仮定すると、あなたは正しい軌道に乗っていましたが、間違ったことは次のとおりです。

(1) userKeyword の各文字を見ていくと、次のようになります。

for (lengthCounter=0; lengthCounter<wordLength; lengthCounter++){
    if (userKeyword.charAt(lengthCounter) != userKeyword.charAt(lengthCounter + 1)){

あなたがしたように、ループ内で userKeyword を変更すると、めちゃくちゃになります。文字はシフトオーバーしますが、インデックスをインクリメントし続けます。つまり、一部の文字をスキップします。

(2) lengthCounter と lengthCounter+1 の文字を見ているので、文字列の終わりに達したときに注意する必要はありません。この場合、インデックスが最後の文字に到達しないようにします。これは、その後に文字がなく、charAt(lengthCounter + 1) がクラッシュするためです。forを と言うように変更しますlengthCounter < wordLength-1

(3) 最後に、revendedKeyword と userKeyword を 1 文字の文字列に設定しています。

String revisedKeyword = "" + userKeyword.charAt(lengthCounter);
userKeyword = revisedKeyword;

これは確かにあなたが望むものではありません。おそらく、キーワード全体を保持するために新しい文字列を設定する必要があります。このようなもの:これをループのに置きます

String newKeyword = "";

そして、それに新しいキャラクターを追加するには

newKeyword = newKeyword + userKeyword.charAt(lengthCounter);

ループ内で userKeyword を変更しないでください。最後に、newKeyword が答えになります。

(ループなどの使い方を学ぶ必要があると思います。実際には、正規表現を使用してすべてを1行で実行できると思いますが、それは演習のポイントではありません。)

于 2013-08-10T00:34:24.153 に答える
0

簡単な解決策は

public class duplicate

{
  public static void main(String args[])
   {
     String a= "stackoverflow";
     char c[]=a.toCharArray();
     int l=a.length();
     String b="";
     for(int i=0;i<l;i++)
       {
            if(b.contains(""+c[i]))
            {   
            }
            else
            {
                b=b+""+c[i];
            }
        }


    System.out.println(b);

    }

}
于 2014-08-30T10:51:38.413 に答える
0
String removeDuplicates(String s) {

    //Unicode characters range from 0x0000 to 0xFFFF
    boolean[] marker = new boolean[0xFFFF]; 

    StringBuilder sb = new StringBuilder();

    for(int i =0; i< s.length();i++) {
        char c = s.charAt(i);

        if(marker[c] == false) {
            //Character is first time occurred
            sb.append(c);

            //mark character as occurred
            marker[c] = true; 
        }
    }
    return sb.toString();
}
于 2014-02-04T12:29:00.750 に答える
0

清潔でシンプルにしましょう。次のコードは、 に保持されている文字.charAt(char c)が に見つからないことを確認しresult Stringます。

public static void main(String[] args)
{
    String input = "ABCADEDBF";
    String result = delDuplicate(input);
    System.out.println(result);
}


public static String delDuplicate(final String str)
{
    String result = "";

    for (int i = 0; i < str.length(); i++)
        if (!result.contains(str.charAt(i) + ""))
            result += str.charAt(i);

    return result;
}
于 2013-08-10T03:36:53.827 に答える