如何使用索引用String替换char

时间:2014-02-15 10:17:35

标签: java string replace

用字符串替换字符的最佳方法是什么:例如:

在我的情况下,我有一个包含拉丁文字符和符号的字符串我用intermec打印机打印它。我必须使用以下打印机传递字符的代码ASCII 说明:

 instruction CHR$(<dec. ascii value>)

示例: 此文字: N°Box 将按如下方式进行转换:

    "N\""+";CHR$(179); \""+"Box"

我写了这个:

if (!isValid(str)) {
    Map charsAsciiCode = new HashMap();
    for (int i = 0; i < str.length(); i++) {
        String c = String.valueOf(str.charAt(i));
        if (specialCharsMap.containsKey(c)) {
            String decimalString = (String) specialCharsMap.get(c);
            charsAsciiCode.put(new Integer(i), " \";CHR$(" + decimalString + ");\"");
        }
    }

    Iterator iter = charsAsciiCode.entrySet().iterator();

    while (iter.hasNext()) {
        Map.Entry mapEntry = (Map.Entry) iter.next();
        int charIndex = (int) mapEntry.getKey();
        String charAscii = (String) mapEntry.getValue();

        // Here i want to replace every char with the correspondant Ascii value
    }
}

static boolean isValid(String input) {
    Matcher m = p.matcher(input);
    return m.matches();
}

final static Pattern p = Pattern.compile("\\p{Alpha}+");
private static Map specialCharsMap = new HashMap();

static {
    specialCharsMap.put("é", "123");
    specialCharsMap.put("è", "125");
    specialCharsMap.put("à", "64");
    specialCharsMap.put("ç", "92");
    specialCharsMap.put("^", "94");
    specialCharsMap.put("'", "39");
}

3 个答案:

答案 0 :(得分:1)

至少有两种天真的方法可以解决这个问题:

  1. 遍历每个char并通过附加原始char或转换后的
  2. 来构建新字符串
  3. 迭代每个映射,并在String
  4. 上调用replaceAll

    这两个实现:

    String replaceCharsByRebuilding(String str, Map<Character, String> mapping) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < str.length(); ++i) {
            char c = str.charAt(i);
            String replacement = mapping.get(c);
            builder.append(replacement == null ? c : replacement);
        }
        return builder.toString();
    }
    
    String replaceCharsByReplaceAll(String str, Map<Character, String> mapping) {
        for (Map.Entry<Character, String> entry : mapping.entrySet()) {
            str = str.replaceAll(entry.getKey().toString(), entry.getValue());
        }
        return str;
    }
    

    两者都应该给出相同的结果,但我认为第一个应该更好。

答案 1 :(得分:1)

您不需要Map,因为您可以这样做:

StringBuilder sb = new StringBuilder();

for (int i = 0; i < str.length(); i = i+1) {
    char ch = str.charAt(i);
    if (ch > 127) {
        // TODO: generate all the \\""+; crap around CHR$()
        sb.append(String.format("CHR$(%d)", (int)ch));
    }
    else 
        sb.append ch;
}

答案 2 :(得分:1)

在函数printerString下面,将普通字符串转换为打印机编码中的字符串。

static final Map<Character, Character> specialCharsMap = new HashMap<>();
static {
    specialCharsMap.put('é', (char)123);
    specialCharsMap.put('è', (char)125);
    specialCharsMap.put('à', (char)64);
    specialCharsMap.put('ç', (char)92);
    specialCharsMap.put('^', (char)94);
    specialCharsMap.put('\'', (char)39);
}

static String printerString(String s) {
    StringBuilder sb = new StringBuilder(s.length());
    for (int i = 0; i < s.length(); ++i) {
        char ch = s.charAt(i);
        Character specialCh = specialChars.get(ch);
        if (specialCh != null) {
            ch = specialCh;
        }
        sb.append(ch);
    }
    return sb.toString();
}

首先,CHR$(123)是将ASCII 123转换为String(一个字符)的基本编程语言函数调用。我们可以通过用等效的打印机编码字符替换特殊(Unicode)字符来实现同样的目的。

对于java初学者:它依赖于自动装箱 - 将char(基本类型)转换为Character(对象包装器)。