Java项目源码学习笔记(三):PathMatcher
2016-04-16 17:13
676 查看
先来看看内部类Node节点:
很显然,这是一个单向链表数据结构:
其中mMap中Node对象指向下一个Node对象。
add构建了根节点为mRoot的单向链表,之所以Node用HashMap保存链表的下一个节点,是因为mRoot一个根节点指向了很多单向链表分支。mKind是每一条单链表分支的key值,它赋给了最后一个节点。
Path string的最后一个segment是"*",匹配任何字符,同时由mVariables保存这一字符。
private static class Node{ private HashMap<String, Node> mMap; private int mKind = NOT_FOUND; Node addChild(String segment){ if(null == mMap){ mMap = new HashMap<String, Node>(); }else{ Node node = mMap.get(segment); if(node != null)return node; } Node n = new Node(); mMap.put(segment, n); return n; } Node getChild(String segment){ if(mMap == null)return null; return mMap.get(segment); } void setKind(int kind){ mKind = kind; } int getKind(){ return mKind; } }
很显然,这是一个单向链表数据结构:
其中mMap中Node对象指向下一个Node对象。
import java.util.ArrayList; import java.util.HashMap; public class PathMatcher{ public static final int NOT_FOUND = -1; private ArrayList<String> mVariables = new ArrayList<String>(); private Node mRoot = new Node(); public PathMatcher(){ mRoot = new Node(); } public void add(String pattern, int kind){ String[] segments = Path.split(pattern); Node current = mRoot; for(int i = 0; i < segments.length; i++){ current = current.addChild(segments[i]); } current.setKind(kind); } public int match(Path path){ String[] segments = path.split(); mVariables.clear(); Node current = mRoot; for(int i = 0; i < segments.length; i++){ Node next = current.getChild(segments[i]); if(null == next){ next = current.getChild("*"); if(next != null){ mVariables.add(segments[i]); }else{ return NOT_FOUND; } } current = next; } return current.getKind(); } }
add构建了根节点为mRoot的单向链表,之所以Node用HashMap保存链表的下一个节点,是因为mRoot一个根节点指向了很多单向链表分支。mKind是每一条单链表分支的key值,它赋给了最后一个节点。
Path string的最后一个segment是"*",匹配任何字符,同时由mVariables保存这一字符。
相关文章推荐
- java学习笔记之数组排序
- Spring MVC @Transactional注解方式事务失效的解决办法
- Java 多态运行顺序&&多态上转型对象
- Java学习(二)
- SpringMVC拦截器(资源和权限管理)
- [Spring]Annotation-based container configuration_AnotationBasis_01
- SpringMVC中使用Interceptor拦截器
- struts2中OGNL详解
- Spring与Struts2整合的执行原理.
- spring入门
- eclipse导入工程中文乱码问题
- Ubuntu 14.04 安装jdk
- java之jsp笔记
- Java项目源码学习笔记(二):Path
- java学习第一天
- poj 2429 GCD & LCM Inverse 【java】+【数学】
- 【Java集合源码剖析】HashMap源码剖析
- eclipse项目调试配置文件路径
- Java基础(1)
- Java的运算符--与(&)、非(~)、或(|)、异或(^)详解