在之前的项目需求中,遇到一个字符串一种字符标识为1种类型。
如字符串: a#aa|b#bb$c#aaa。。。这种
其中
#号一组的有:[a,aa,bb,aaa]
分组为$有:[c]
分组|的有:[b]
.......
里面规则是:第一个符号前面没有标识符则列入后面的分组,后面字符串没有标识符则列入前面标识分组,其余中间部分按前面标识符分组
如(前无):a 前面没有标识符,则取后面#号
如2(后无):aaa后面没有标识符,则取前面
如3(中间):aa前面#号,则是#号分组,b前面是|,这是|号分组
以此类推。。。。
代码如下:
/***
* @param src 操作的符号
* @param symbol 操作的符号
* */
public static Map<String, List<String>> byteOpare(char[] src, char[] symbol) {
Map<String, List<String>> result = new HashMap<String, List<String>>();
int size = src.length;
String prefix = null, suffix = null;
String buf = "";
for (int i = 0; i < size; i++) {
// 第一个字符和最后的字符特殊处理
char b = src[i];
if (i == 0) {
if (compareSymbol(b, symbol)) { // 特殊字符
prefix = b + "";
} else { // 普通字符
prefix = null;
buf += b;
}
} else if (i == size - 1) { // 最后一个特殊处理
if (!compareSymbol(b, symbol)) { // 特殊字符
buf += b;
}
put(result, prefix, buf);
} else { // 中间数据
if (compareSymbol(b, symbol)) { // 特殊字符
suffix = b + "";
if (prefix == null) { // 没有前缀
// 数字按后缀处理
// 并且按后缀保存
put(result, suffix, buf);
} else {
// 有前缀按前缀的来处理
put(result, prefix, buf);
}
prefix = suffix; // 处理完后将后缀变成前缀
suffix = null;
buf = "";
} else {
buf += b;
}
}
}
return result;
}
/**
* 添加至Map
* @param result
* @param key
* @param value
*/
public static void put(Map<String, List<String>> result, String key, String value) {
if(StringUtil.isNullOrEmpty(key)) {
key = "empty";
}
if (result.containsKey(key)) {
((List<String>) result.get(key)).add(value);
} else {
List<String> values = new ArrayList<String>();
values.add(value);
result.put(key, values);
}
}
/**
* 是否包含特殊字符
* */
public static boolean compareSymbol(char target, char[] symbol) {
for (char s : symbol) {
if (s == target) {
return true;
}
}
return false;
}
则以下为测试方法:
String str = "a#aa|b#bb$c#aaa";
Map<String, List<String>> result = new Demo().byteOpare(
str.toCharArray(), new char[] { '#', '$', '|', 'N' });
for (Entry<String, List<String>> entry : result.entrySet()) {
String key = entry.getKey();
System.out.print("分组为" + key + "[");
for (String value : entry.getValue()) {
System.out.print(value + ",");
}
System.out.println("]");
}
打印结果为:
分组为#[a,aa,bb,aaa,]
分组为$[c,]
分组为|[b,]
值得注意的是,如果没有任意标识符的话,Map中的Key为:empty
希望有用上的码友。Mark下