处理一个字符串多个分隔符

在之前的项目需求中,遇到一个字符串一种字符标识为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下

害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞害羞


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值