串是一种常见的数据结构,这里使用Python定义类来实现相应的方法。先看代码,再对相关知识进行讲解。

 # coding=utf-8

 __all__=['ADTString']

 class ADTString(object):
     '''
     此类用于描述串,包含以下方法
     '''
     def __init__(self, d=''):
         '''
         data用于存储串
         '''
         self.data = d

     def StrCopy(self):
         '''
         复制函数,返回主串data
         '''
         return self.data

     def ClearString(self):
         '''
         清空主串
         '''
         self.data = ''

     def StringEmpty(self):
         '''
         判断主串是否为空,返回True或False
         '''
         return False if len(self.data) else True

     def StrLength(self):
         '''
         返回主串的长度
         '''
         return len(self.data)

     def StrCompare(self, T):
         '''
         主串和串T进行比较,大于串T返回1,等于串T返回0,小于串T返回-1
         '''
         len_S = self.StrLength()
         len_T = T.StrLength()
         len_min = min(len_S, len_T)
         len_max = max(len_S, len_T)
         i=j=0
         while(True):
             if (i>=len_min):
                 if len_min==len_max:
                     return 0
                 elif (j >=len_min):
                     return 1 if len_S  > len_T else -1

             if(self.data[i]==T.data[j]):
                 i=i+1
                 j=j+1
             elif self.data[i]<T.data[j]:
                 return -1
             elif self.data[i]>T.data[j]:
                 return 1

     def Concat(self, S2):
         '''
         拼接主串和串S2
         '''
         return self.data+S2.data

     def SubString(self, pos, len_):
         '''
         返回主串中,第pos个字符后len_长的子串
         pos为负数,则逆序
         '''
         if pos >= 0:
             if len(self.data) < pos:
                 return -1
             return self.data[pos:pos+len_]
         else:
             if len_==0 or pos==-1:
                 return ''
             elif pos+len_==0 or abs(pos)<len_:
                 return self.data[pos:-1]+self.data[-1]
             else:
                 return self.data[pos:pos+len_]

     def Index(self, T, pos):
         '''
         若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置,否则返回-1
         '''
         len_T = T.StrLength()
         len_S = self.StrLength()
         if len_S < len_T + pos:
             return -1

         p1 = pos
         p2 = pos + len_T
         while(p2<=len_S):
             if self.SubString(p1, len_T) == T.data:
                 return p1
             else:
                 p1=p1+1
                 p2=p2+1

         if p2 > len_S:
             return -1

     def IndexBruteforce(self, T, pos):
         '''
         朴素匹配算法,若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置,否则返回-1;不使用串定义的方法来实现
         '''
         len_T = T.StrLength()
         len_S = self.StrLength()
         i=pos
         j=0
         while(True):
             if i >= len_S or j >= len_T:
                 break
             if(self.data[i]==T.data[j]):
                 i=i+1
                 j=j+1
             else:
                 i=i-j+1
                 j=0

         return i-j if j>=len_T else -1

     def GetNext(self):
         '''
         返回KMP匹配算法所需的next数组
         '''
         len_S=self.StrLength()
         next=[0]
         i=1
         while(True):
             if i>=len_S:
                 break

             k = next[i-1]
             while(self.data[k]!=self.data[i] and k!=0):
                 k=next[k-1]
             if self.data[k]==self.data[i]:
                 next.append(k+1)
             else:
                 next.append(0)

             i=i+1
         return next

     def IndexKMP(self, T, pos):
         '''
         KMP匹配算法,若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置,否则返回-1;不使用串定义的方法来实现
         '''
         next=self.GetNext()
         len_T = T.StrLength()
         len_S = self.StrLength()
         i=pos
         j=0
         while(True):
             if i >= len_S or j >= len_T:
                 break
             if(self.data[i]==T.data[j]):
                 i=i+1
                 j=j+1
             else:
                 i=i+next[i]+1
                 j=0
         return i-j if j>=len_T else -1

     def Replace(self, T, V):
         '''
         用串V替换主串S中,出现的所有与串T相等的不重叠的子串
         '''
         string = ''
         len_S = len(self.data)
         len_T = len(T.data)
         p1=p2=0
         while(True):
             pos = self.Index(T, p2)
             if pos == -1:
                 string+=self.data[p2:]
                 break
             else:
                 p1=pos
                 string+=self.data[p2:p1]
                 string+= V.data
                 p2=p1+len_T

         if string == '':
             return self.data
         else:
             return string

     def StrInsert(self, pos, T):
         '''
         在主串的第pos个字符后,插入串T;pos为负,则逆序插入
         '''
         len_S = len(self.data)
         if len_S < pos or len_S <abs(pos):
             return -1

         return self.data[:pos]+T.data+self.data[pos:]

     def StrDelete(self, pos, len_):
         '''
         在主串的第pos个字符后,删除len_长度的字符
         pos小于0则逆序删除
         '''
         len_S = len(self.data)
         if pos >= 0:
             if len_S < pos:
                 return -1
             return self.data[:pos]+self.data[pos+len_:]
         else:
             if len_S < abs(pos) :
                 return -1
             return self.data[:pos-len_]+self.data[pos:]

 if __name__ == '__main__':
     from ADTString import ADTString
     # 打印该类的readme文档
     print help(ADTString)

  第3行:__all__中定义的内容,是使用from <module> import * 时,会导出的内容。

  第15~218行:串的一些基本方法,其中,第86~105行的Index,是使用到串SubString方法来实现的;第107~125行,是使用朴素匹配算法实现的;第149~167行,是使用KMP匹配算法来实现的。

  第223行:是打印根据代码和注释,自动生成的参考文档。

  下面对这个类进行单元测试,使用unittest模块,代码的最后两行,是执行单元测试的意思。

 # conding=utf-8

 from ADTString import ADTString
 import unittest

 class TestADTStringMethods(unittest.TestCase):
     def setUp(self):
         self.obj = ADTString()

     def tearDown(self):
         pass

     def test_StrCopy(self):
         self.obj.data=''
         self.assertEqual(self.obj.StrCopy(), '')
         self.obj.data='goodgoogle'
         self.assertEqual(self.obj.StrCopy(), 'goodgoogle')
         self.obj.data='!'
         self.assertEqual(self.obj.StrCopy(), '!')

     def test_ClearString(self):
         self.obj.data='goodgoogle'
         self.obj.ClearString()
         self.assertEqual(self.obj.data, '')

     def test_StringEmpty(self):
         self.obj.data=''
         self.assertEqual(self.obj.data, '')

     def test_StrLength(self):
         self.obj.data='
         self.assertEqual(self.obj.StrLength(), 3)
         self.obj.data=''
         self.assertEqual(self.obj.StrLength(), 0)

     def test_StrCompare(self):
         obj_T=ADTString('goodgoogle')
         self.obj.data='goodgoogle'
         self.assertEqual(self.obj.StrCompare(obj_T),0)
         self.obj.data='goodgoogl'
         self.assertEqual(self.obj.StrCompare(obj_T),-1)
         self.obj.data='goodgooglea'
         self.assertEqual(self.obj.StrCompare(obj_T),1)

     def test_Concat(self):
         self.obj.data='good'
         obj_S2=ADTString('google')
         self.assertEqual(self.obj.Concat(obj_S2),'goodgoogle')
         self.obj.data=''
         self.assertEqual(self.obj.Concat(obj_S2),'google')

     def test_SubString(self):
         self.obj.data='goodgoogle'
         self.assertEqual(self.obj.SubString(0,0),'')
         self.assertEqual(self.obj.SubString(0,1),'g')
         self.assertEqual(self.obj.SubString(0,4),'good')
         self.assertEqual(self.obj.SubString(0,100),'goodgoogle')
         self.assertEqual(self.obj.SubString(100,1),-1)
         self.assertEqual(self.obj.SubString(-50,0),'')
         self.assertEqual(self.obj.SubString(-5,0),'')
         self.assertEqual(self.obj.SubString(-1,0),'')
         self.assertEqual(self.obj.SubString(-1,1),'')
         self.assertEqual(self.obj.SubString(-1,2),'')
         self.assertEqual(self.obj.SubString(-6,1),'g')
         self.assertEqual(self.obj.SubString(-6,6),'google')
         self.assertEqual(self.obj.SubString(-6,100),'google')
         self.assertEqual(self.obj.SubString(-6,10),'google')

     def test_Index(self):
         self.obj.data='goodgoogle'
         obj_T=ADTString('good')
         self.assertEqual(self.obj.Index(obj_T, 0),0)
         self.assertEqual(self.obj.Index(obj_T, 1),-1)
         self.obj.data='googlegood'
         self.assertEqual(self.obj.Index(obj_T, 0),6)
         self.assertEqual(self.obj.Index(obj_T, 7),-1)
         self.obj.data=''
         self.assertEqual(self.obj.Index(obj_T, 0),-1)

     def test_IndexBruteforce(self):
         self.obj.data='goodgoogle'
         obj_T=ADTString('good')
         self.assertEqual(self.obj.Index(obj_T, 0),0)
         self.assertEqual(self.obj.Index(obj_T, 1),-1)
         self.obj.data='googlegood'
         self.assertEqual(self.obj.Index(obj_T, 0),6)
         self.assertEqual(self.obj.Index(obj_T, 7),-1)
         self.obj.data=''
         self.assertEqual(self.obj.Index(obj_T, 0),-1)

     def test_IndexKMP(self):
         self.obj.data='goodgoogle'
         obj_T=ADTString('good')
         self.assertEqual(self.obj.Index(obj_T, 0),0)
         self.assertEqual(self.obj.Index(obj_T, 1),-1)
         self.obj.data='googlegood'
         self.assertEqual(self.obj.Index(obj_T, 0),6)
         self.assertEqual(self.obj.Index(obj_T, 7),-1)
         self.obj.data=''
         self.assertEqual(self.obj.Index(obj_T, 0),-1)

     def test_Replace(self):
         self.obj.data='good'
         obj_T=ADTString('good')
         obj_V=ADTString('replace')
         self.assertEqual(self.obj.Replace(obj_T, obj_V),'replace')
         self.obj.data='googlegood'
         self.assertEqual(self.obj.Replace(obj_T, obj_V),'googlereplace')
         self.obj.data='goodgooglegood'
         self.assertEqual(self.obj.Replace(obj_T, obj_V),'replacegooglereplace')
         self.obj.data=''
         self.assertEqual(self.obj.Replace(obj_T, obj_V),'')
         self.obj.data='aaa'
         self.assertEqual(self.obj.Replace(obj_T, obj_V),'aaa')

     def test_StrInsert(self):
         self.obj.data='goodgoogle'
         obj_T=ADTString('insert')
         self.assertEqual(self.obj.StrInsert(0,obj_T),'insertgoodgoogle')
         self.assertEqual(self.obj.StrInsert(100,obj_T),-1)
         self.assertEqual(self.obj.StrInsert(len(self.obj.data),obj_T),'goodgoogleinsert')
         self.assertEqual(self.obj.StrInsert(4,obj_T),'goodinsertgoogle')
         self.assertEqual(self.obj.StrInsert(-1,obj_T),'goodgooglinserte')
         self.assertEqual(self.obj.StrInsert(-100,obj_T),-1)

     def test_StrDelete(self):
         self.obj.data='goodgoogle'
         self.assertEqual(self.obj.StrDelete(0,4),'google')
         self.assertEqual(self.obj.StrDelete(0,100),'')
         self.assertEqual(self.obj.StrDelete(-1,1),'goodgooge')
         self.assertEqual(self.obj.StrDelete(-2,3),'goodgle')
         self.assertEqual(self.obj.StrDelete(-2,100),'le')
         self.assertEqual(self.obj.StrDelete(-100,1),-1)

 suite = unittest.TestLoader().loadTestsFromTestCase(TestADTStringMethods)
 unittest.TextTestRunner(verbosity=2).run(suite)

  执行的结果如下:

test_ClearString (__main__.TestADTStringMethods) ... ok
test_Concat (__main__.TestADTStringMethods) ... ok
test_Index (__main__.TestADTStringMethods) ... ok
test_IndexBruteforce (__main__.TestADTStringMethods) ... ok
test_IndexKMP (__main__.TestADTStringMethods) ... ok
test_Replace (__main__.TestADTStringMethods) ... ok
test_StrCompare (__main__.TestADTStringMethods) ... ok
test_StrCopy (__main__.TestADTStringMethods) ... ok
test_StrDelete (__main__.TestADTStringMethods) ... ok
test_StrInsert (__main__.TestADTStringMethods) ... ok
test_StrLength (__main__.TestADTStringMethods) ... ok
test_StringEmpty (__main__.TestADTStringMethods) ... ok
test_SubString (__main__.TestADTStringMethods) ... ok

----------------------------------------------------------------------
Ran 13 tests in 0.001s

OK
[Finished in 0.1s]

Python用类实现串以及对串的方法进行单元测试的更多相关文章

  1. Python: 自定义类对象序列化为Json串

    之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonTool class Score: math = ...

  2. 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的顺序输出,如果传入的是一个字符串,就将字符串反序输出。

    namespace test2 { class Program { /// <summary> /// 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的 ...

  3. 类对象序列化为json串,json串反序列化为类对象

    1.类对象序列化为json串: 方法一: class P(object): def __init__(self,name,age,sex): self.name=name self.age=age s ...

  4. Python中读取文件中的json串,并将其写入到Excel表格中

    Json:JavaScript Objective Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用语http请求中, ...

  5. 也说python的类--基于python3.5

    在面向对象的语言中,除了方法.对象,剩下的一大重点就是类了,从意义上来讲,类就是对具有相同行为对象的归纳.当一个或多个对象有相同属性.方法等共同特征的时候,我们就可以把它归纳到同一个类当中.在使用上来 ...

  6. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  7. 【python】类中的self

    在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...

  8. python基础——类和实例

    python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...

  9. python的类和对象——进阶篇

    写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...

随机推荐

  1. Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeExcep

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  2. (中等) POJ 1191 棋盘分割,DP。

    Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次 ...

  3. mac 访问mysql客户端

    /usr/local/mysql/bin/mysql -u root -p //mac mysql 管理工具推荐 sequek pro

  4. 10、手把手教你Extjs5(十)自定义模块的设计

    从这一节开始我们来设计并完成一个自定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息.以下信息只是我自己在开发过程中想到或用到的,希望有新的想法的或者有建议的跟贴回复. 一个独立模块包含以下 ...

  5. 服务器性能分析工具gprof的使用及没有生成gmon.out文件的原因

            早上从网上查看资料时无意中看到了gprof这个工具,随便把他用在项目里试了一下.结果发现调用次数的数据比较全,但调用时间基本上都是0.网上查了一下发现gprof只记录执行时间超过0.0 ...

  6. jquery核心功能分析

    作者:zccst 核心功能包括: jQuery是如何定义的,如何调用的,如何扩展的.掌握核心方法是如何实现的,是理解jQuery源码的关键.这里理解了一切豁然开朗. 1,如何定义,即入口 // Def ...

  7. IOS9提示“不受信任的开发者”如何处理

    iPhone升级到IOS9版本后,发现部分APP在下载后首次运行时,都会提示“不受信任的应用程序开发者”,这是因为企业证书发布的APP,没有经过AppStore审核,于是iOS对用户做出一个安全性的提 ...

  8. ubuntu12.04+fuerte 下跑通lsd-slam——数据集

    lsd-slam(下载链接:https://github.com/tum-vision/lsd_slam)提供了两种方法,一种是用数据集(下载地址http://vision.in.tum.de/lsd ...

  9. 《Web接口开发与自动化测试 -- 基于Python语言》 ---前言

    前    言 本书的原型是我整理一份Django学习文档,从事软件测试工作的这六.七年来,一直有整理学习资料的习惯,这种学习理解再输出的方式对我非常受用,博客和文档是我主要的输出形式,这些输出同时也帮 ...

  10. Java编译时出现No enclosing instance of type XXX is accessible.

    今天在编译Java程序的时候出现以下错误: No enclosing instance of type Main is accessible. Must qualify the allocation ...