一次简单的代码优化

127 阅读2分钟

之前在逛百度知道的时候看到一个问题,题目如下:

图片.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);

把那么长的判断变成了这么短的代码,而且功能一模一样.真是神奇.