好的,这是我的问题。我需要根据提供的信息格式化文本。对于某个约束,我只能将控制字符串附加到原始文本的前面。处理时我必须跳出前面的字符串来获取原始文本。并非所有文本都需要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
以获取原始版本。
所以我的问题是,如何对原始文本进行编码,以便当我们跳出新文本的前面的字符串时,我们不会影响原始文本?
答案 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;
}