非顺序构建字符串?

时间:2016-02-04 21:05:04

标签: java string replace build

例如:

你给了一个单词和Set个字母。如果单词包含不在Set范围内的字母,则这些字母将用短划线“替换”。您实际上并不应该更改给定的单词,而是创建一个反映这些更改的新String

说你有一个词:“magikarp”。 Set包含字母'm','k','p'。你将返回的字符串是“m --- k - p”。

如何仅使用StringString方法来实现这一目标?我也不能使用任何外部库。

使用数组对我来说更直观,但这必须通过构建String来执行,而不是为了提高效率而构建任何额外的数据结构。

这是我接触它的方式(工作解决方案,但没有通过建立String来完成),以进一步澄清:

public String getPattern (SortedSet<Character> guesses, String word) {
    char[] pattern = word.toCharArray();
        for (int i = 0; i < wordLength; i++) {
            if (!guesses.contains(pattern[i])) {
                pattern[i] = '-';
            }
        }
    // Pads each character in the generated String with spaces and trims
    // the leading and trailing spaces. 
    return new String(pattern).replace("", "").trim();
    }
}

3 个答案:

答案 0 :(得分:3)

你可以使用String已经提供的东西,一个获取每个字符的方法和一个用另一个字符替换特定字符的方法:

public String getPattern (Set<Character> guesses, String word) {
    for (int i=0; i<word.length(); ++i) {
         char c = word.charAt(i);
         if (!guesses.contains(c)) 
             word = word.replace(c, '-');
    }
    return word;
}

它效率不高,因为它会为每个需要替换的字符创建一个新的字符串实例。为了提高效率,使用StringBuilder会更好。

答案 1 :(得分:2)

如何从字符集构建正则表达式字符串,并将其用作String.replaceAll方法的参数以返回已过滤的字符串?

    Set<Character> letters = new HashSet<>();
    letters.add('m');
    letters.add('k');
    letters.add('p');

    String filter = "[^(";
    for (Character letter : letters) {
        filter += letter;
    }
    filter += ")]";

    String toBeReplaced = "magikarp";

    String result = toBeReplaced.replaceAll(filter, "-");

答案 2 :(得分:1)

这肯定不是解决问题的最佳方法,除了它&#34;建立字符串&#34;。

String newWord = "";
for (int i = 0; i < word.length(); i++) {
    char c = word.charAt(i);
    newWord = newWord + (
        guesses.contains(c) ? c : '-'
    );
}

此方法在每个字母上创建一个新的String实例,而不是快速替换。但它会建立起来&#34;。