7

やあ、私は文字列を非表示にする方法を見つけようとしましたが、私が見つけたコードは私のアプリケーションでうまく機能します...文字列内の文字をいずれかで非表示にする方法はあります*-

4

5 に答える 5

10

これはパスワードを作るためですか?次のことを考慮してください。

class Password {
    final String password; // the string to mask
    Password(String password) { this.password = password; } // needs null protection
    // allow this to be equal to any string
    // reconsider this approach if adding it to a map or something?
    public boolean equals(Object o) {
        return password.equals(o);
    }
    // we don't need anything special that the string doesnt
    public int hashCode() { return password.hashCode(); }
    // send stars if anyone asks to see the string - consider sending just
    // "******" instead of the length, that way you don't reveal the password's length
    // which might be protected information
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; < password.length(); i++) 
            sb.append("*");
        return sb.toString();
    }
}

または絞首刑執行人のアプローチのために

class Hangman {
    final String word;
    final BitSet revealed;
    public Hangman(String word) {
        this.word = word;
        this.revealed = new BitSet(word.length());
        reveal(' ');
        reveal('-');
    }
    public void reveal(char c) {
        for(int i = 0; i < word.length; i++) {
            if(word.charAt(i) == c) revealed.set(i);
        }
    }
    public boolean solve(String guess) {
        return word.equals(guess);
    }
    public String toString() {
         StringBuilder sb = new StringBuilder(word.length());
         for(int i = 0; i < word.length; i++) {
             char c = revealed.isSet(i) ? word.charAt(i) : "*";
         }
         return sb.toString();
    }
}
于 2012-08-27T19:32:46.087 に答える
5

元の文字と同じ文字数で文字列を作成し、代わりに「わかりにくい」文字を作成します。

String x = "ABCD";

String output = "";
for (int i = 0; i < x.length(); i++) {
    output += "*";
}

または、を使用することもできますx.replaceAll("\\S", "*")。これにより、空白も保持されます。

于 2012-08-27T19:37:22.963 に答える
2

これを実現する方法はいくつかありますが、アプリケーションによって異なります。

String#replaceAll(String regex, String replacement)一挙にすべての文字を別の文字でマスクする場合は、次の方法を使用できます: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replaceAll(java。 lang.String、%20java.lang.String)

これには、任意の空白文字または非空白文字に一致する正規表現をregex使用することが含まれます。[\s\S]正規表現ではreplacementなく、通常の文字列を使用します。この場合、アスタリスクが必要な場合は、ハイフン「-」に「*」を使用します。これは非常に単純です。

@Roddy of the Frozen Peaここにある他のすべての方法は、とを除いてうまく機能する@djc391ので、私は正しく答えました。

幸運を

于 2014-02-01T16:17:48.487 に答える
1

次のようなものを簡単に実装できます。

public class MaskedString
{
    private String data;

    public MaskedString(String data){this.data = data;}
    public void append(char c){data += c;}
    public void setData(String data){this.data = data;}

    public String getMasked()
    {
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<data.length(); i++)
            sb.append('*');
        return sb.toString();
    }

    public String getString()
    {
        return data;
    }
}

あなたはアイデアを得る:)

于 2012-08-27T19:49:45.900 に答える
0

私の実装:

public static String maskString(String s, int x) {
    int n = s.length()/x;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
      if (n >= 1 && (i < n || i >= (s.length() - n))) {
        sb.append(s.charAt(i));
      }
      else {
        sb.append("*");
      }
    }
    return sb.toString();
  }
于 2020-03-12T02:47:10.287 に答える