一次簡單的程式碼優化

zhumeilu發表於2017-12-14

之前在逛百度知道的時候看到一個問題,題目如下:

圖片.png

本著助人為樂的精神,我就簡單的想了一下,首先用一個for迴圈,分別取出String陣列裡面的字串,然後切割字串,接著判斷字串的長度,然後根據字串的長度分別處理,如果字串長度為1,則說明該字串是一級目錄,如果該字串長度為2,則說明該字串是二級目錄.後面的同理.然後在字串長度判斷裡面判斷該一級分類是否存在,如果不存在則建立,存在則不處理.

這個邏輯是我一開始想到的也是我看到這個需求的第一感覺的處理方法.接著就開始程式設計了.

程式碼:

@Getter
@Setter
public class Menu {

	private Long id;
	private List child = new ArrayList<>();
	
	public Menu(Long id) {
		this.id = id;
	}
}

	public static void main(String[] args) {
		String[] a = {"1", "1-3-2", "1-2", "1-2"};
		List<Menu> list = new ArrayList<>();		//存放一級目錄
		Menu menuTemp = null;
		for (int i = 0; i < a.length; i++) {
			String[] b = a[i].split("-"); 
			//一級選單
			if(b.length==1){
				menuTemp = new Menu(Long.valueOf(b[0]));
				//如果不存在
				Menu exist = isExist(menuTemp,list);
				if(exist==null){
					list.add(menuTemp);
				}
				//二級選單
			}else if(b.length == 2){
				//一級選單是否存在
				menuTemp = new Menu(Long.valueOf(b[0]));
				Menu exist = isExist(menuTemp,list);
				//如果不存在
				if(exist == null){
					//新增一級選單
					list.add(menuTemp);
					Menu menuTemp2 = new Menu(Long.valueOf(b[1]));
					//新增二級選單
					menuTemp.getChild().add(menuTemp2);
				}else{
					menuTemp = new Menu(Long.valueOf(b[1]));
					Menu exist2  = isExist(menuTemp,exist.getChild());
					//如果二級選單不存在
					if(exist2==null){
						exist.getChild().add(menuTemp);
					}
				}
				//三級選單
			}else if(b.length == 3){
				//一級選單是否存在
				menuTemp = new Menu(Long.valueOf(b[0]));
				Menu exist = isExist(menuTemp,list);
				//一級選單不存在
				if(exist == null){
					list.add(menuTemp);
					Menu menuTemp2 = new Menu(Long.valueOf(b[1]));
					//新增二級選單
					menuTemp.getChild().add(menuTemp2);
					Menu menuTemp3 = new Menu(Long.valueOf(b[2]));
					//新增三級選單
					menuTemp2.getChild().add(menuTemp3);
				//一級選單存在	
				}else{
					menuTemp = new Menu(Long.valueOf(b[1]));
					Menu exist2  = isExist(menuTemp,exist.getChild());
					//如果二級選單不存在
					if(exist2==null){
						exist.getChild().add(menuTemp);
						Menu menuTemp3 = new Menu(Long.valueOf(b[2]));
						menuTemp.getChild().add(menuTemp3);
						
					}else{
						//todo
					}
				}
			}
		}
		String jsonArray = JSONArray.toJSONString(list);
		System.out.println(jsonArray);
	}
	private static Menu isExist(Menu menu,List<Menu> list){
		for (Menu obj : list) {
			if(menu.getId().equals(obj.getId())){
				return obj;
			}
			
		}
		return null;
	}
複製程式碼

寫到後面的第三次判斷的 時候我就感覺不對勁了.這判斷怎麼這麼多?而且這還只是三層選單,而且每新增一層,就要多加這個層數的個數的判斷,這麼寫肯定不行.

後來就想了一下.

		List list2 = new ArrayList<>();
		
		for (int i = 0; i < a.length; i++) {
			String[] b = a[i].split("-"); 
			List tempList = list2;
			Menu tempMenu = null;
			for (int j = 0; j < b.length; j++) {
				tempMenu = new Menu(Long.valueOf(b[j]));
				Menu exist = isExist(tempMenu,tempList);
				if(exist==null){
					tempList.add(tempMenu);
					tempList = tempMenu.getChild();
				}else{
					tempList = exist.getChild();
				}
			}
			
		}
		String jsonArray2 = JSONArray.toJSONString(list2);
		System.out.println(jsonArray2);
複製程式碼

把那麼長的判斷變成了這麼短的程式碼,而且功能一模一樣.真是神奇.

相關文章