好吧,这是我的问题。我有一个需要根据提供的信息格式化文本。对于某些约束,我只能将控制字符串附加到原始文本&在处理时,我必须跳出前字符串以获得原始文本。不是所有的文本都需要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
以获得原始的。
所以我的问题是,如何编码原始文本的方式,当我们绊倒了新文本的前字符串,我们不会影响原始文本?
如果您不喜欢常量控制字符串。您可以根据输入构建控件字符串。
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;
}
在这里,我在给定输入字符串的哈希码之前和之后添加了"~"
。注意**,String的hashcode方法,将遍历字符串中的所有字符并执行31的乘法
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
所以这将基于给定的字符串。这可能会影响性能,如果你打算使用巨大的字符串作为org string。并且哈希码在对象的一个生命周期内只构建一次。
您可以将hashcode
替换为任何您认为唯一的字符串。
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;
}