Tuesday, October 10, 2008

分别用javascript和Python处理相同的字符串

http://www.popub.net/script/pcasunzip.html有一个省、市、地区联动选择JS封装类
javascript是这样实现的:将所有省市区的名字放到一个字符串里使用分隔符分割,
这个字符串很长,在点击 这里下载javascript的实现。
下面的javascrip将省市区分别放在PCAPPCACPCAA三个数组里:

PCAD="北京市$市辖..."//太长省略
PCAArea=[];
PCAP=[];//All Provinces
PCAC=[];//All Cities   PCAC[ProvinceIndex][i];
PCAA=[];//All Areas   PCAA[ProvinceIndex][CityIndex][i]

PCAN=PCAD.split("#");
alert("province Length:   "+PCAN.length)
for(i=0;i<PCAN.length;i++)
{
    
PCAA[i]=[];TArea=PCAN[i].split("$")[1].split("|");
    
for(j=0;j<TArea.length;j++)
    {
        
PCAA[i][j]=TArea[j].split(",");
        
if(PCAA[i][j].length==1)
            
PCAA[i][j][1]=SAT;
        
TArea[j]=TArea[j].split(",")[0]
    }
    
PCAArea[i]=PCAN[i].split("$")[0]+","+TArea.join(",");
    
PCAP[i]=PCAArea[i].split(",")[0];
    
PCAC[i]=PCAArea[i].split(',')
}


下面我用Python处理上面相同的字符串取出所有省市区:

# coding=utf-8

 

import string

 

SPT="请选择省份"

SCT="请选择城市"

SAT="请选择地区"

PCAD="北京市$市辖区,东城区,西…"; #太长省略

PCAD=SPT+"$"+SCT+","+SAT+"#"+PCAD

PCAArea=[]

PCAP=[]#fAll Provinces

PCAC=[]#fAll Cities   PCAC[ProvinceIndex][i];

PCAA=[]#fAll Areas   PCAA[ProvinceIndex][CityIndex][i]

PCAN=PCAD.split("#")

 

for PCAN_I in PCAN:

    lst = []# PCAA[i]

    TArea=PCAN_I.split("$")[1].split("|")

    for TArea_J in TArea:

        PCAA_I_J=TArea_J.split(",")

        if(len(PCAA_I_J)==1):

            PCAA_I_J.append(SAT)

        lst.append(PCAA_I_J)# PCAA[i][j]

        TArea_J=TArea_J.split(",")[0]

    PCAA.append(lst)

    PCAArea_I = PCAN_I.split("$")[0]+","+string.join(TArea,',')

    PCAArea.append(PCAArea_I)

    PCAP.append(PCAArea_I.split(",")[0])

    PCAC.append(PCAArea_I.split(','))

 

for pid in range(len(PCAP)):

    for cid in range(len(PCAA[pid])):

        for aid in range(len(PCAA[pid][cid])):

            if(aid!=0):

                print PCAP[pid] +"\t"+ PCAA[pid][cid][0] +"\t"+ PCAA[pid][cid][aid]

 


Tags: Python


Saturday, September 09, 2008

动态类加载及反射演示类

package org.mytest;
 
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
/*
 * 动态类加载及反射演示类
 */
 
publicclass DynamicClassLoader {
    private String attribute = "我是DynamicClassLoader类的属性!";
    public String str2 = "hi";
 
    public String getAttribute() {
        returnattribute;
    }
 
    public DynamicClassLoader() {}
 
    publicvoid setAttribute(String attribute) {
        this.attribute = attribute;
    }
 
    publicint getAttribute2() {
        return 110;
    }
 
    protectedvoid protectedMethod() {}
 
    privatevoid privateMethod() {}
 
    publicstaticvoid main(String s[]) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        // \\\\\\\\\\\\\\\\\\\\\\动态加载//////////////////
        DynamicClassLoader dcl0 = new DynamicClassLoader();// 这是我们通常创建一个类实例的做法--new
        System.out.println("new类实例,并打印实例dcl0的属性 = " + dcl0.getAttribute());
 
        Class class1 = Class.forName("org.mytest.DynamicClassLoader");
        DynamicClassLoader dcl1 = (DynamicClassLoader) class1.newInstance();
        System.out.println("Class.forName动态加载获得的类实例,并打印实例dcl1的属性 = " + dcl1.getAttribute());
 
        Class class2 = ClassLoader.getSystemClassLoader().loadClass("org.mytest.DynamicClassLoader");
        DynamicClassLoader dcl2 = (DynamicClassLoader) class2.newInstance();
        System.out.println("ClassLoader.loadClass动态加载获得的类实例,并打印实例dcl2的属性 = "    + dcl2.getAttribute());
 
        System.out.println("dcl1==dcl2" + (dcl1==dcl2));
        System.out.println("dcl1==dcl0" + (dcl1==dcl0));
        System.out.println("dcl2==dcl0" + (dcl1==dcl0));
       
        System.out.println("dcl0.getClass().getClassLoader()" + (dcl0.getClass().getClassLoader()));
        System.out.println("dcl1.getClass().getClassLoader()" + (dcl1.getClass().getClassLoader()));
        System.out.println("dcl2.getClass().getClassLoader()" + (dcl2.getClass().getClassLoader()));
        //讲解如果要求按照业务逻辑定义自己的对象比对策略(如hibernatepo可以仅仅比对
        //主键、主键等则两个po等),则重写(覆盖)equals方法和hashcode方法
       
        // ///////////////方法反射//////////////////
        DynamicClassLoader d = new DynamicClassLoader();
        Object o = (Object) d;
        System.out.println("o.getClass() = " + o.getClass());
 
        Method[] methods = o.getClass().getMethods();
        System.out.println("methods.length = " + methods.length);
        for (int i = 0; i < methods.length; i++) {
            System.out.print("method" + (i + 1) + ":\t");
            System.out.println(methods[i]);
        }
        System.out.println("---------------------");
 
        Method[] methods2 = o.getClass().getDeclaredMethods();
        System.out.println("methods2.length = " + methods2.length);
        for (int i = 0; i < methods2.length; i++) {
            System.out.print("method" + (i + 1) + ":\t");
            System.out.println(methods2[i]);
        }
   
        /////////////////穿插属性反射//////////////////
        System.out.println("--------穿插属性反射--------");
        Field[] fields = o.getClass().getDeclaredFields();
        System.out.println(fields.length);
        for(int i = 0; i<fields.length; i++){
            System.out.print("field" + (i + 1) + ":\t");
            System.out.println(fields[i]);
        }
        System.out.println("---------继续方法反射---------");
       
        /////////////////继续方法反射//////////////////
        for(int i = 0; i<methods.length; i++){
            System.out.print("method" + (i + 1) + ":\t");
            System.out.println(methods[i]);
            Method method = methods[i];
            String methodName = method.getName();
            String returnType = method.getReturnType().getName();
           
            if(methodName.startsWith("get")&&!methodName.startsWith("getClass")){
                if(returnType.equals("java.lang.String")){
                    String returnval = (String)method.invoke(d,null);
                    System.out.println("java.lang.String reval = "+returnval);
                }elseif(returnType.equals("String")){
                    String returnval = (String)method.invoke(d,null);
                    System.out.println("String reval = "+returnval);
                }elseif(returnType.equals("java.lang.Integer")){
                    Integer returnval = (Integer)method.invoke(d,null);
                    System.out.println("Integer reval = "+returnval);
                }elseif(returnType.equals("int")){
                    Integer returnval = (Integer)method.invoke(d,null);
                    System.out.println("int reval = "+returnval);
                }
            }
        }
    }
}
 
/*
 * 几点结论:
 * 对于private的方法getMethods()不反射、getDeclaredMethods()反射;
 * 对于protected的方法getMethods()不反射、getDeclaredMethods()反射;
 * getMethods()反射继承的和自身的public方法、getDeclaredMethods()反射自身声明的所有方法。
 */

Tags: J2SE