本文共 2290 字,大约阅读时间需要 7 分钟。
在之前的项目需求中,遇到一个字符串一种字符标识为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> byteOpare(char[] src, char[] symbol) { Map > result = new HashMap >(); 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 > result, String key, String value) { if(StringUtil.isNullOrEmpty(key)) { key = "empty"; } if (result.containsKey(key)) { ((List ) result.get(key)).add(value); } else { List values = new ArrayList (); 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> result = new Demo().byteOpare( str.toCharArray(), new char[] { '#', '$', '|', 'N' }); for (Entry > 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下