如何将字符串附加到原始文本的前面以创建新文本&然后跳出前面的字符串而不影响原始文本?

时间:2014-03-24 15:29:22

标签: java encode

好的,这是我的问题。我需要根据提供的信息格式化文本。对于某个约束,我只能将控制字符串附加到原始文本的前面。处理时我必须跳出前面的字符串来获取原始文本。并非所有文本都需要controlString。

前:

String originalText1="iPhone";
String controlString= "colorLevel=2*";
String newText1 =controlString+originalText1; //ie newText=colorLevel=2*iPhone

String originalText2="iPhone 3G"; // this originalText2 has no controlString
String newText2="iPhone 3G";

String originalText3="colorLevel=2*aaa"; // this has no controlString but its front is exactly the same as controlString
String newText3="colorLevel=2*aaa";

String originalText4="colorLevel=2*bbb"; // has controlString but at the same time its front is exactly the same as controlString
String controlString= "colorLevel=2*";
String newText4 =controlString+originalText4; // ie newText4=colorLevel=2*colorLevel=2*bbb

好的,现在我需要一个函数来读取所有这些新文本。此功能需要脱离controlString以获取原始版本。

所以我的问题是,如何对原始文本进行编码,以便当我们跳出新文本的前面的字符串时,我们不会影响原始文本?

1 个答案:

答案 0 :(得分:0)

如果您不喜欢常量控制字符串。您可以根据输入构建控制字符串。

static final String delimiterChar = "~";
static final String controlStringPattern = "^~-?\\d+~";

public static StringBuffer  encode(String orgText){
    StringBuffer buffer = new StringBuffer();
    buffer.append(delimiterChar);
    buffer.append(orgText.hashCode());
    buffer.append(delimiterChar);
    buffer.append(orgText);
    return buffer;

}

这里我在给定输入字符串的哈希码之前和之后添加了"~"。 注意**,字符串的哈希码方法,将遍历字符串中的所有字符并执行31的乘法

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

所以这将基于给定的String。如果您计划使用巨大的字符串作为org String,这可能会影响性能。并且hashcode只为该对象的生命周期构建一次。

您可以将hashcode替换为您认为是unquie的任何字符串。

解码

public static String  decode(String orgText){
    return  orgText.replaceAll(controlStringPattern, "");
}

更详细的解码。这样可以确保给定数字的哈希码与Decoded String匹配。仔细检查

public static String  decode(String orgText){
    Matcher matcher = pattern.matcher(orgText);
    if (matcher.find()){
        String hashString = matcher.group();
        int hash = Integer.parseInt(hashString.substring(1,           hashString.length()-1));
        String txt = orgText.substring(hashString.length());
        if (txt.hashCode() == hash){
            return txt;
        }
    }
    return orgText;
}

进行测试

public static void main(String[] args) {
    //System.out.println(new String("~12345~").matches(controlStringPattern));
    String orgText = "Hi i am org Text";
    StringBuffer encodeText = encode(orgText);
    System.out.println("Orginial :" + orgText);
    System.out.println("Encoded :" + encodeText);
    System.out.println("Decoded :" + decode(encodeText.toString()));
    System.out.println("Decoded :" + decode("I am not Encoded"));

}

输出为

Orginial :Hi i am org Text
Encoded :~-1828588409~Hi i am org Text
Decoded :Hi i am org Text
Decoded :I am not Encoded

如果你想单独获得控制字符串..

public static String getControlStringifExists(String orgText){
    Matcher matcher = pattern.matcher(orgText);
    if (matcher.find()){
        String hashString = matcher.group();
        int hash = Integer.parseInt(hashString.substring(1, hashString.length()-1));
        String txt = orgText.substring(hashString.length());
        if (txt.hashCode() == hash){
            return hashString;
        }
    }
    return null;
}