不拋出越界異常的求子串方法

   用String.substring方法,不小心會有越界異常。現實現一個沒拋出越界異常,越界就返回null,不過直接返回的再用其它方法,可能有Null異常。現還實現可以負index的,可能逆向的。

package com.chenlb.util;

public class StringUtil {
	
	/**
	 * start與end均可負數<br/>
	 * start < end正向取, start > end逆向取<br/>
	 * 示例:str="I am chenlb"<br/>
	 * StringUtil.substring(str, 0, 12) -> null<br/>
	 * StringUtil.substring(str, 12, 12) -> null<br/>
	 * StringUtil.substring(str, 12, 13) -> null<br/>
	 * StringUtil.substring(str, 4, 4) -> ""<br/>
	 * StringUtil.substring(str, 0, 4) -> "I am"<br/>
	 * StringUtil.substring(str, -4, -1) -> "enl"<br/>
	 * StringUtil.substring(str, -2, 4) -> "lbI am"<br/>
	 * StringUtil.substring(str, 4, 0) -> "ma I"<br/>
	 * StringUtil.substring(str, -1, -4) -> "lne"<br/>
	 * StringUtil.substring(str, 1, -4) -> "Iblne"<br/>
	 * StringUtil.substring(str, 0, -4) -> "blne"<br/>
	 * StringUtil.substring(str, -4, 0) -> "enlb"<br/>
	 * @return 越界返回null, start==end返回空
	 * @author chenlb 2008-6-18 下午12:39:51
	 */
	public static String substring(String str, int start, int end) {
		if(str == null) {
			return null;
		}
		int len = str.length();
		if(Math.abs(start) >= len) {
			return null;
		}
		if(Math.abs(end) > len) {
			return null;
		}
		StringBuilder sb = new StringBuilder();
		if(end > start) {	//正向
			substring(sb, str, start, end);
		} else if(end == start) {
			return "";
		} else {	//逆向 end < start
			substring(sb, str, end, start);
			sb.reverse();
		}
		return sb.toString();
	}
	
	private static void substring(StringBuilder sb, String str, int start, int end) {
		int len = str.length();
		if(start < 0) {
			if(end < 0) {
				sb.append(str.substring(len+start, len+end));
			} else {
				sb.append(str.substring(len+start, len));
				sb.append(str.substring(0, end));
			}
		} else {
			sb.append(str.substring(start, end));
		}
	}
}

 

測試代碼:

public void testSubstring() {
		String str = "I am chenlb";
		
		assertEquals(null, StringUtil.substring(str, 0, 12));
		assertEquals(null, StringUtil.substring(str, 12, 12));
		assertEquals(null, StringUtil.substring(str, 12, 13));
		
		assertEquals("", StringUtil.substring(str, 4, 4));
		
		assertEquals("I am", StringUtil.substring(str, 0, 4));
		assertEquals("am", StringUtil.substring(str, 2, 4));
		assertEquals("I am chenlb", StringUtil.substring(str, 0, 11));
		
		assertEquals("enl", StringUtil.substring(str, -4, -1));
		assertEquals("lbI am", StringUtil.substring(str, -2, 4));
		
		assertEquals("ma I", StringUtil.substring(str, 4, 0));
		assertEquals("lne", StringUtil.substring(str, -1, -4));
		assertEquals("Iblne", StringUtil.substring(str, 1, -4));
		
		assertEquals("blne", StringUtil.substring(str, 0, -4));
		assertEquals("enlb", StringUtil.substring(str, -4, 0));
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章