在数据处理的过程中,需要用到根据URL前缀匹配类型的步骤,我首先从导航网站上把一些主流的网址全部爬取下来,首先是对于字典进行一个分类。在这里我做了一个链表,链表的每一个节点都是一个HashMap,是字典中的url前缀,以及该前缀所属的类标号。
接下来我把链表建立的主要代码整理一下:
首先节点类:Link_Node
public class Link_Node {
protected Link_Node next; //指针域
protected HashMap<String,String> data;//数据域
public Link_Node(HashMap<String,String> data) {
this. data = data;
}
public HashMap<String,String> getData() {
return data;
}
public void setData(HashMap<String,String> data) {
this.data = data;
}
//显示此节点
public void display() {
System. out.print( data + " ");
}
}
然后是链表的实现
public class LinkList {
public Link_Node first; // 定义一个头结点
private int pos = 0;// 节点的位置
public LinkList() {
this. first = null;
}
// 插入一个头节点
public void addFirstNode(HashMap<String,String> data) {
Link_Node node = new Link_Node(data);
node. next = first;
first = node;
}
// 删除一个头结点,并返回头结点
public Link_Node deleteFirstNode() {
Link_Node tempNode = first;
first = tempNode. next;
return tempNode;
}
// 在任意位置插入节点 在index的后面插入
public void add(int index,HashMap<String,String> data) {
Link_Node node = new Link_Node(data);
Link_Node current = first;
Link_Node previous = first;
while ( pos != index) {
previous = current;
current = current. next;
pos++;
}
node. next = current;
previous. next = node;
pos = 0;
}
// 删除任意位置的节点
public Link_Node deleteByPos( int index) {
Link_Node current = first;
Link_Node previous = first;
while ( pos != index) {
pos++;
previous = current;
current = current. next;
}
if(current == first) {
first = first. next;
} else {
pos = 0;
previous. next = current. next;
}
return current;
}
// 显示出所有的节点信息
public void displayAllNodes() {
Link_Node current = first;
while (current != null) {
current.display();
current = current. next;
}
System. out.println();
}
// 根据位置查找节点信息
public Link_Node findByPos( int index) {
Link_Node current = first;
if ( pos != index) {
current = current. next;
pos++;
}
return current;
}
public static void main(String[] args) {
LinkList linkList = new LinkList();
HashMap<String,String> a=new HashMap<String,String>();
HashMap<String,String> b=new HashMap<String,String>();
HashMap<String,String> c=new HashMap<String,String>();
a.put("a","1");
b.put("b","2");
c.put("c","2");
linkList.addFirstNode(a);
System.out.println("按照位置寻找");
linkList.findByPos(0);
//19,21,20
linkList.add(1, b); //19,22,21,20
linkList.displayAllNodes();
// Node node = linkList.deleteFirstNode();
// System.out.println("node : " + node.data);
// linkList.displayAllNodes();
// node = linkList.deleteByPos(2);
// System.out.println("node : " + node.data);
// linkList.displayAllNodes();
// linkList.deleteFirstNode();
}
}
3、构造字典的分类模型
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import tools.JavaReadExcel;
/**
* 功能:构建字典的分类模型
* @author ys
*
*/
public class dic_list {
/**
* 获取字典中所有URL的长度大于一段的集合
* @return
*/
public HashMap<ArrayList<String>,String> dic_muil_listAll(){
HashMap<ArrayList<String>,String> dic = new HashMap<ArrayList<String>,String>();
//返回长度大于1 的网址
HashMap<ArrayList<String>,String> dic1 = new HashMap<ArrayList<String>,String>();
JavaReadExcel jre=new JavaReadExcel();
dic = jre.readexcel();
Set<ArrayList<String>> dicSet = dic.keySet();
Iterator<ArrayList<String>> dicIter = dicSet.iterator();
while(dicIter.hasNext())
{
//字典的总数
ArrayList<String> dicTmp = dicIter.next(); //去掉学号的所有的url
String sort_type = dic.get(dicTmp);
//把字典按照分段 分成几类 一类是全部都是第一段的集合 第二段的集合 第三段的集合
if(dicTmp.size()>1){
dic1.put(dicTmp,sort_type);
}
}
return dic1;
}
/**
* 返回多段中 第一段的集合,第二段的集合,第三段或者更多段的集合一共三个集合 在链表中
* @return
*/
public LinkList dic_muil_list(){
//构造url字典决策树的根节点
HashMap<ArrayList<String>,String> dic = new HashMap<ArrayList<String>,String>();
JavaReadExcel jre=new JavaReadExcel();
dic = jre.readexcel();
Set<ArrayList<String>> dicSet = dic.keySet();
Iterator<ArrayList<String>> dicIter = dicSet.iterator();
LinkList linkList1 = new LinkList();
HashMap<String,String> first=new HashMap<String,String>();
HashMap<String,String> first_1=new HashMap<String,String>();
HashMap<String,String> first_2=new HashMap<String,String>();
while(dicIter.hasNext())
{
//字典的总数
ArrayList<String> dicTmp = dicIter.next(); //去掉学号的所有的url
String sort_type = dic.get(dicTmp);
//把字典按照分段 分成几类 一类是全部都是第一段的集合 第二段的集合 第三段的集合
if(dicTmp.size()>1){
if(!first.containsKey(dicTmp.get(0)))
{
first.put(dicTmp.get(0),sort_type);
}
if(!first_1.containsKey(dicTmp.get(1)))
{
first_1.put(dicTmp.get(1),sort_type);
}
if(dicTmp.size()>2){
if(!first_1.containsKey(dicTmp.get(2)))
{
first_2.put(dicTmp.get(2),sort_type);
}
}else if(dicTmp.size()>3){
if(!first_1.containsKey(dicTmp.get(3)))
{
first_2.put(dicTmp.get(3),sort_type);
}
}
}
}
linkList1.addFirstNode(first);
linkList1.add(1,first_1);
linkList1.add(2,first_2);
System.out.println("分段的");
linkList1.displayAllNodes();
return linkList1;
}
/**
* 返回只有一段的字典的集合
* @return
*/
public LinkList dic_sigle_list(){
//构造单段的字典的集合
HashMap<ArrayList<String>,String> dic = new HashMap<ArrayList<String>,String>();
JavaReadExcel jre=new JavaReadExcel();
dic = jre.readexcel();
Set<ArrayList<String>> dicSet = dic.keySet();
Iterator<ArrayList<String>> dicIter = dicSet.iterator();
LinkList linkList2 = new LinkList();
HashMap<String,String> second=new HashMap<String,String>();
while(dicIter.hasNext())
{
ArrayList<String> dicTmp = dicIter.next();
String sort_type = dic.get(dicTmp);
if(dicTmp.size()==1){
second.put(dicTmp.get(0),sort_type);
}
}
linkList2.addFirstNode(second);
System.out.println("没有分段的");
linkList2.displayAllNodes();
return linkList2;
}
public static void main(String args[]){
dic_list ut=new dic_list();
System.out.println(ut.dic_muil_listAll());
ut.dic_muil_list();
ut.dic_sigle_list();
}
}
最后是匹配的算法实现。。。。现在貌似准确度还有点问题。。。等以后完善一下再整理吧。。。。。或者关于用户的url根据字典url进行匹配来判断用户访问的是哪类网站的实现。。有没有人有更好的实现方法。。求推荐。