|
|
|
发新文章 |
|
|
2018年12月26日
摘要: 其实知识点没什么困难的,就是编辑器中输入这些公式稍微有点麻烦。卸载这边可以给大家参考,我本地整理的不一定都会发上来。
线性代数中的矩阵是什么?
一般是指n元一次方程组,未知数和元相同。
row picture, 行图像, 对于三维方程组来说,就是一个平面
column picture,列图像, 对于三维方程组来说,就是一个向量(起... 阅读全文
2017年7月15日
java开发搞了两个月了,由于前后端都要打通,发现了一些以前没注意的问题。
我自己的经验是这些:
RPC+Model:采用grpc+protobuf的方案,在android和ios之间都很方便通信,比起传统的HTTP(s)+JSON方式,开发效率和运行效率都要高很多,不过门槛比较高一点,工作两年的程序员应该能比较顺畅的入门,主要是ios端配置方面稍微麻烦一些。
IPC:android多个应用间的通信,测试过了aidl的方式,目前开发起来比较麻烦,报错系统做得太差了,没有找到合适的插件工具处理在android studio中的问题。估计后面干脆改成grpc的方式看看效果如何。
长链接:打算使用netty,还要看看开发的难易程度。
开发模式:看样子MVC真的已经过时了。
1. ios和android 都可以使用MVVM,比MVC解耦能力强得多。
2.服务器上,ESB容器外加OSGi组成SOA,也要方便很多。
3.linux客户端,QT半残废,Xwindow主流包装,已经是gnome。
SQL:持久层和缓存层一般都是注册和保存数据使用
1.注册方案,鉴于zookeeper坑太多,偏向于选择consul,consul不像zookeeper这么抽象,封装了服务化的http api,非常方便调用,并且增加了对服务健康检查。
2.为什么不选用redis?没深入研究redis。个人认为codis方案(豆瓣开发的分布式缓存)能够满足实际场景的需求。
2017年4月12日
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
买了这个板子有好久了,去年放着没心思搞,今天觉得该干点事了。
我的目标是要使用tx1上的摄像头来抓取视频帧并做识别。
首先,jetson tx-1的板载摄像头是不提供默认v4l2的驱动的,所以我自己给它找了驱动,但是这个驱动是基于gstreamer的。
所以,我整合了一套gstreamer的管道命令,如下:
export CLIENT_IP=127.0.0.1
gst-launch-1.0 nvcamerasrc fpsRange="30 30" intent=3 ! nvvidconv flip-method=6 ! 'video/x-raw(memory:NVMM), width=(int)960, height=(int)540, format=(string)I420, framerate=(fraction)30/1' ! omxh264enc control-rate=2 bitrate=4000000 ! 'video/x-h264, stream-format=(string)byte-stream' ! h264parse ! queue ! omxh264dec ! nvvidconv ! 'video/x-raw, format=(string)UYVY' ! videoconvert ! jpegenc quality=30 ! rtpjpegpay ! udpsink host=$CLIENT_IP port=5000 sync=false async=false
这段代码把摄像头上的内容抓取并压缩为960p的30帧的h264格式的视频流,并通过udp协议丢出到板卡的5000号端口上。
以上是gstreamer的服务器端,接下来,可以将内容抓取下来看看。
客户端的命令我就不写了,直接使用代码。这段代码是从youtube上的jetson的openCV教程组装来的,自己找了一下opencv处理gstreamer的API,搭上就可以用。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/calib3d/calib3d.hpp>
using namespace cv;
int main(int, char**)
{
VideoCapture input("./stream.sdp");
if(!input.isOpened()){ // check if we succeeded
std::cout<< "open failed" << std::endl;
return -1;
}
Mat img, img_gray;
OrbFeatureDetector detector(7000);
vector<KeyPoint> img_keypoints, car_keypoints;
Mat img_descriptors, car_descriptors;
input.read(img);
Mat car;
img(Rect(400, 320, 150, 100)).copyTo(car);
detector(car, Mat(), car_keypoints, car_descriptors);
drawKeypoints(car, car_keypoints, car);
for(;;)
{
if(!input.read(img))
break;
detector(img, Mat(), img_keypoints, img_descriptors);
drawKeypoints(img, img_keypoints, img);
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(car_descriptors, img_descriptors, matches);
vector<Point2f> car_points, img_points;
for(int i=0; i < matches.size(); ++i){
car_points.push_back(car_keypoints[matches[i].queryIdx].pt);
img_points.push_back(img_keypoints[matches[i].queryIdx].pt);
}
std::cout<<"car points count = " << car_points.size() << std::endl;
if(car_points.size() >= 4){
Matx33f H = findHomography(car_points, img_points, CV_RANSAC);
vector<Point> car_border, img_border;
car_border.push_back(Point(0, 0));
car_border.push_back(Point(0, car.rows));
car_border.push_back(Point(car.cols, car.rows));
car_border.push_back(Point(car.cols, 0));
for (size_t i = 0; i < car_border.size(); ++i){
Vec3f p = H * Vec3f(car_border[i].x, car_border[i].y, 1);
img_border.push_back(Point(p[0]/p[2], p[1]/p[2]));
}
polylines(img, img_border, true, CV_RGB(255, 255, 0));
Mat img_matches;
drawMatches(car, car_keypoints, img, img_keypoints, matches, img_matches);
imshow("img_matches", img_matches);
}
// imshow("car", car);
// imshow("img", img);
if(waitKey(27) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
编译的makefile会麻烦一点:先写一个cmake的配置文件CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(hello)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(cv_hello hello.cpp)
target_link_libraries(cv_hello ${OpenCV_LIBS})
执行命令:cmake ./ && make
然后生成cv_hello,可以执行。
关键配置文件是stream.sdp文件,这个文件帮我减少了命令行的麻烦。内容如下:
[stream.sdp]
c=IN IP4 127.0.0.1
m=video 5000 RTP/AVP 96
a=rtpmap:96 JPEG/4000000
全部内容结束。可以看到摄像头的视频内容了
2017年3月13日
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
稳定的分层:
数学家/物理学家常常会说:“c是个常量,p是个参量,v是个变量”。他们的意思是这三个都是可变的,但是存在一种可变的层次差别。c构成全局条件,p构成全局性更弱的一种条件---他可以在c固定时保持变动,最后v可以在c和p保持固定时变来变去的。
设想牙科医生不可能让病人的位置变来变去的,但是医生自己变动位置是有用的。其中的概念便是:c是病人,p是病人的牙齿,而v是医生本人。
框架和嵌套:
在框架语言中,可以说情景的心智表示包含着彼此嵌套的框架。
设想有若干个柜子,每个柜子上可以装若干个抽屉,这些抽屉可以放进“子框架”,你可以把别的柜子压缩后放进去,这个过程可以递归。
在思想层面,我们会把“人”的概念扭曲压缩。比如在羽毛球赛球场上,你会把人考虑成一个队员,你已经把“人”这个概念压缩到“羽毛球赛”中去了。
用框架进行知识表示的理论依赖于这样一个想法:世界是由半封闭的子系统构成的。
滑动:
我们会把想法进行变形,我们必须要适时的产生使得概念变形的能力,没有什么绝对不变的东西。也不能把事情弄得模凌两可的,以至于根本丧失意义。
我们会把圆形“滑动”为椭圆形,或者凹陷的圆形。但是不会把圆形“滑动”成三角形,虽然他们都是闭环图形。
跳跃性和全局后退:
设想有一条狗,目标要获得一块骨头,前方有一面栅栏,栅栏有门。
“新手”会直接冲向栅栏有骨头的位置,然后碰到栅栏过不去了,就会“旺旺。。”。“老手”会先跑到门口,绕过门口然后再跑向骨头。
这里有一个思维跳跃性的过程,曲线救国的方式,在多次直接方式取得不好的后果后,高级的思维需要跳出原有的思维,后退几步来看待问题。这在深度学习上,是一种经验演变。但是他应该可以从思维的不同层次的滑动中推演出来。
演员系统:
框架+演员=符号。演员之间传递消息,但是消息的解释取决于演员自己的特性,于是符号的内容将由框架和演员共同决定.演员是信号的启发器
多重表示:
副总统是政府这部汽车的备用轮胎。概念骨架不仅必须存在于不同的抽象层次上,还需要存在于不同概念“维度”上。
关于人工智能的几个的问题:
1.程序能否写出优美的乐曲?
会的,但不是现在。音乐是情感的语言,精神世界不可低估。能有如此能力的“程序”必须得能自己走进这个世界,在纷繁的世界中与生活抗争,并每时每刻体验到自己的感受。他必须懂得暗夜里凉风带来的喜悦与孤独,懂得对于带来温暖爱抚地手掌的渴望,还要能体验到一个人死去后引起的心碎与生活。明了放弃与厌世,悲伤与失望,决心与胜利,虔诚与敬畏。能把希望/恐惧/烦恼/欢乐/宁静/不安等对立的情绪混合到一起。。。。
2.是否可以在低层次设置核心参数控制程序?
不能,如同人不会在意自己每天死掉几千个神经原一样,我们几乎没事,除非你要给大脑做手术折腾的太厉害。但这已经不属于低层次控制
3.人工智能是否存在超智能?
可能和规模有关,我们也许有一个临界点,也许人类已经位于零界点之上。有一天会达到全能自我认知,即笛卡尔的“我思故我在”将演变为“我在思我所思”。
也许人工智能有一天达到了人类的智能,但是他会进入下一阶段。我们可能还不知道那是什么样的。
4.是否存在能击败任何人的下棋程序?
可能已经有,但是现在还只是下棋。
跳出下棋,普遍的去看,真正的只能必然依赖于一种纵览全局的能力---即可以说是在程序中编入了一种“跳出系统外”的能力。一旦实现了这一步,你就无法再完全控制这个程序了,他将超过一个特定的临界点,那时你不得不与你造出来的东西打交道。
智能的可抽取性
为阐明大脑中发生的思维过程,有两个基本问题
一个是解释低层次的神经发射通讯是如何导致高层次的符号激活通讯的,
另一个是自足地解释高层次的符号激活通讯——建立一个不涉及低层神经事件的理论。
如果后者是可能的——这是目前进行的所有人工智能研究的基础中的一个关键假设——那么智能就可能实现于不同于大脑的其它硬件上。那将表明智能是一种可以从它所在的硬件中"抽取。出来的性质——换句话说,智能将是一种软件性质。
这将意味着意识和智能这一现象的确和大多数极其复杂的自然现象一样是高层次的它们有自身的高层规律,这些归律依赖于低层,但又可以从低层中抽取出来。相反,如果没有全部由神经原(或模拟神经原)组成的硬件就绝对无法实现符号触发模式的话,这将意味着智能是一种局限于人脑的现象,比起那种可以用一个具有若干不同层次的规律体系来说明的现象,对它的
释要困难得多。
2017年1月9日
find . -name *.swift | xargs perl -p -i -e '/NSIndexPath/IndexPath/g'
find . -name *.swift | xargs perl -p -i -e 's/NSIndexPath/IndexPath/g'
find . -name *.swift | xargs perl -p -i -e 's/heightForRowAtIndexPath/heightForRowAt/g'
#find . -name *.swift | xargs perl -p -i -e 's/CGRectMake/RectMake/g'
find . -name *.swift | xargs perl -p -i -e 's/cellForRowAtIndexPath/cellForRowAt/g'
find . -name *.swift | xargs perl -p -i -e 's/forRowAtIndexPath/forRowAt/g'
find . -name *.swift | xargs perl -p -i -e 's/didSelectRowAtIndexPath/didSelectRowAt/g'
find . -name *.swift | xargs perl -p -i -e 's/cellForItemAtIndexPath/cellForItemAt/g'
find . -name *.swift | xargs perl -p -i -e 's/shouldSelectItemAtIndexPath/shouldSelectItemAt/g'
find . -name *.swift | xargs perl -p -i -e 's/didSelectItemAtIndexPath/didSelectItemAt/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_\:NSURLSessionDataTask\!\, resp\:AnyObject\!\)/\(_, resp\) /g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, rspObj:AnyObject!\)/\(_, resp\) /g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, resp:AnyObject\!\)/\(_, resp\) /g'
find . -name *.swift | xargs perl -p -i -e 's/_:URLSessionDataTask!, responseObj:AnyObject!/_, responseObj/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, error:NSError\!\)/\(_, error\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_:NSURLSessionDataTask!, error:NSError!\)/\(_, error\)/g'
find . -name *.swift | xargs perl -p -i -e 's/func doAction\(_ action: String, model: AnyObject\!, fromView: UIView\?\)/func doAction\(_ action: String, model: Any\!, fromView: UIView\?\)/g'
find . -name *.swift | xargs perl -p -i -e 's/CGPointZero/CGPoint.zero/g'
find . -name *.swift | xargs perl -p -i -e 's/CGFloat.max/\CGFloat\.greatestFiniteMagnitude/g'
find . -name *.swift | xargs perl -p -i -e 's/\.NoData/\.noData/g'
find . -name *.swift | xargs perl -p -i -e 's/\.Fail/\.fail/g'
find . -name *.swift | xargs perl -p -i -e 's/UIEdgeInsetsZero/UIEdgeInsets.zero/g'
#autoPinEdgeToSuperviewEdge
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Leading/\.autoPinEdge\(toSuperviewEdge\: \.leading/g'
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Trailing/\.autoPinEdge\(toSuperviewEdge\: \.trailing/g'
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Bottom/\.autoPinEdge\(toSuperviewEdge\: \.bottom/g'
find . -name *.swift | xargs perl -p -i -e 's/\.autoPinEdgeToSuperviewEdge\(\.Top/\.autoPinEdge\(toSuperviewEdge\: \.top/g'
find . -name *.swift | xargs perl -p -i -e 's/codecToInstance\(/codec\(toInstance:/g'
find . -name *.swift | xargs perl -p -i -e 's/UIFont\.\.systemFont/UIFont\.systemFont/g'
#下面这两句处理的是不同的函数
#find . -name *.swift | xargs perl -p -i -e 's/deselectRowAtIndexPath\(/deselectRow\(at:/g'
#find . -name *.swift | xargs perl -p -i -e 's/deselectRowAtIndexPath\(/deselect\(at:/g'
find . -name *.swift | xargs perl -p -i -e 's/\.locationInView\(/\.location\( in:/g'
find . -name *.swift | xargs perl -p -i -e 's/CGRectZero/CGRect.zero/g'
find . -name *.swift | xargs perl -p -i -e 's/\.dismissViewControllerAnimated\(/\.dismiss\(animated: /g'
find . -name *.swift | xargs perl -p -i -e 's/LocalCache\.sharedCache\(\)\.cachedObjectForKey\(/LocalCache\.shared\(\)\.cachedObject\(forKey/g'
find . -name *.swift | xargs perl -p -i -e 's/LocalCache\.shared\(\)\.cachedObject\(forKey/LocalCache\.shared\(\)\.cachedObject\(forKey\:/g'
find . -name *.swift | xargs perl -p -i -e 's/willDisplayCell/willDisplay/g'
find . -name *.swift | xargs perl -p -i -e 's/XRZPostLoadingView\.showSuccessfulWithTitle\(/XRZPostLoadingView\.showSuccessful\(withTitle\:/g'
#这个地方改了以后需要尾部添加括号,需要手动搜索NotificationCenter.default.post(name:NSNotification.Name(rawValue出来修改
find . -name *.swift | xargs perl -p -i -e 's/NSNotificationCenter\.defaultCenter\(\)\.postNotificationName\(/NotificationCenter\.default\.post\(name\:\ NSNotification.Name\(rawValue\: /g'
find . -name *.swift | xargs perl -p -i -e 's/\.showTextWithTitle\(/\.showText\(withTitle\:/g'
find . -name *.swift | xargs perl -p -i -e 's/\.showSuccessWithTitle\(/\.showSuccessful\(withTitle\:/g'
find . -name *.swift | xargs perl -p -i -e 's/\(task\:URLSessionDataTask\!\,\ respon\:AnyObject\!\)/\(_\,\ respon\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_,\ reponseObj\:AnyObject\!\)/\(_\,\ respon\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_\:URLSessionDataTask\!\,\ responseObj\:AnyObject\!\)/\(_\,\ respon\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_, responseObj:AnyObject!\)/\(_, responseObj\)/g'
find . -name *.swift | xargs perl -p -i -e 's/task:URLSessionDataTask!, error:NSError!/_, error/g'
find . -name *.swift | xargs perl -p -i -e 's/\(task:URLSessionDataTask!, responseObj:AnyObject!\)/\(_, responseObj\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\(_\:URLSessionDataTask\!\,\ error\:NSError\!\)/\(_\,\ error\)/g'
find . -name *.swift | xargs perl -p -i -e 's/\.popToRootViewControllerAnimated\(/\.popToRootViewController\(animated: \/g'
find . -name *.swift | xargs perl -p -i -e 's/removeAlert\(/let _ = removeAlert\(/g'
find . -name *.swift | xargs perl -p -i -e 's/\.addObject\(/\.add\(/g'
find . -name *.swift | xargs perl -p -i -e 's/\.rac_newValueChannelWithNilValue\(/\.rac_newValueChannel\(withNilValue:/g'
find . -name *.swift | xargs perl -p -i -e 's/\.NotMore/\.notMore/g'
find . -name *.swift | xargs perl -p -i -e 's/\.ChatRoom/\.chatRoom/g'
find . -name *.swift | xargs perl -p -i -e 's/\.Normal/\.normal/g'
find . -name *.swift | xargs perl -p -i -e 's/MarkTableViewDD\.normal/MarkTableViewDD\.Normal/g'
find . -name *.swift | xargs perl -p -i -e 's/\.showFailWithTitle\(/\.showFail\(withTitle\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/\.heightFromHitModel\(/\.height\(fromModel\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/model\:AnyObject\!\,/model\:Any\!\,/g'
find . -name *.swift | xargs perl -p -i -e 's/func\ heightForModel\(_\ model\:AnyObject\!\)->CGFloat/func\ heightForModel\(_\ model\:Any\!\)->CGFloat/g'
find . -name *.swift | xargs perl -p -i -e 's/\.showSuccessfulWithTitle\(/\.showSuccessful\(withTitle\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/\.TouchUpInside\.touchUpInside/g'
find . -name *.swift | xargs perl -p -i -e 's/\.rac_signalForControlEvents\(/\.rac_signal\(for\:\ /g'
find . -name *.swift | xargs perl -p -i -e 's/\UIEdgeInsetsZero/\UIEdgeInsets.zero/g'
find . -name *.swift | xargs perl -p -i -e 's/\.systemFontOfSize\(/\..systemFont(ofSize:\ /g'
#find . -name *.swift | xargs perl -p -i -e 's/\.Normal/\.normal/g'
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
2016年7月12日
2016年7月11日
A 左手摸墙算法的描述。
- 当左手边没有墙时,左转前进一步;
- 当左手边有墙且前方没有墙时,前进一步;
- 当左手边有墙且前方也有墙时,右转前进一步;
右手摸墙算法,只需将上面的“左”换作“右”,“右”换作“左”。
B 摸墙算法存在的问题,路径冗余度搞高
比如在一个封闭房间中,左手摸墙算法和右手摸墙算法,使用的总能耗差异很大。
这个问题需要用用遗传算法的思想剞劂。
多次使用左手和右手摸墙算法,依靠积累经验来得到概率结论,然后根据不同条件进行学习之后得知下一次采取哪种摸墙。
C 摸墙算法的性能改善
这个策略只是用与多次重复走一个迷宫的情况,对于走陌生的迷宫,不适用。
当作出一次移动时,在路径中查找先前是否经过相同的点,如果有那么就说明到这一步为止完成了一个圈子,在遗传算法中,把它从路径中除去。
多次行动测试后,将会改善能耗效果,得到一点经验概率结果。
去除圈子的算法是:
假设左手摸墙走,取得所有已经过路径记为dimension[all]
遍历dimension all to 0, 碰见重复的路径节点,证明,这个点所经历的左手摸墙路径是一个圈
将这个点标记,以后在这里跳过这个位置的左手摸墙而采用直走跳过这个节点。
思考:如何给小车在开放空间中,做环形路径点的标记?
D 深度优先搜索算法:
程序运行时将按照从上到下,从左到右的顺序遍历整棵树。
对于真实环境的物理小车,需要为小车安装指南针或者陀螺仪才行。理论上加速度传感器也能做到,但是算法上也许要稍微复杂一点。
深度优先算法按以下规则执行遍历:
- 1,判断当前节点是否为目标节点,如是,返回成功。
- 2,检查当前节点是否还有未访问过的子节点,若否goto 4。 => 4,检查当前节点是否有上层节点,若有访问上层节点,设为当前节点。goto 1。
- 3,访问子节点,设为当前节点,设已访问。goto 1。
- 5,返回失败。
E 广度优先搜索算法:
-
1、从图中某个顶点V0出发,并访问此顶点;
2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;
3、重复步骤2,直到全部顶点都被访问为止。
广度优先的好处在于,如果有多个出口,那么第一个被找到的出口消耗时间最短,广度最小,也即路劲最短。
另一个额外的好处是,可以知道所有的出口。得到一个统计结果。
2016年3月18日
摘要: 写了太多tableView,发现每次都要实现TableView的两个代理太麻烦。我在swift层面做了一次封装。
我想要每个使用tableView的地方,都不在需要单独实现一份tableViewDataSource和TableViewDelegate.
下面是理想的使用实例:
Code highlighting produced by Actipro CodeHighlighte... 阅读全文
2015年10月9日
没查到相关资料 ,说起来其实也挺简单的,就是使用UIImage的初始化函数重新初始化 - (UIImage *)imageWithScale:(CGFloat)scale{ return [UIImage imageWithData:UIImageJPEGRepresentation(self, 1) scale:scale]; } //swift的代码就不写了
//获得的UIImage能够适应UIButton的无锯齿缩放
2015年6月11日
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
直接给一段调用实例:@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
var str = " \n \r \r\n \t Hello, \n playground \n \t \t \n \n\r \n "
let length = (str as NSString).length
let a = str.escapeHeadTailSpace()
let b = str.stringEscapeHeadTail(strs:["\r", "\n", "\t", "\r\n", " "])
对应结果:
a::\t Hello, \n playground \n
b::Hello, \n playground
处理原理是:针对一个字符串,每次按一个字节跳过给定的字符串,并返回新得到的字符串,反复迭代,直到原字符串中已经找不到给定的字符串。这样,包含在中间的字符是不去除的。
将得到的新字符串反转,同样在处理一遍。这样头尾部的排除字符串集都可以了。然后再将结果反转,得到原来顺序的字符串,即我们需要的结果.
单纯去除其中所有的某个字符集,有原生方法,不再次考虑
这是针对String的扩展:
extension String{
func escapeSpaceTillCahractor()->String{
return self.stringEscapeHeadTail(strs:["\r", " ", "\n"])
}
func escapeHeadStr(str:String)->(String, Bool){
var result = self as NSString
var findAtleastOne = false
while( true ){
var range = result.rangeOfString(str)
if range.location == 0 && range.length == 1 {
result = result.substringFromIndex(range.length)
findAtleastOne = true
}else{
break
}
}
return (result as String, findAtleastOne)
}
func escapeSpaceTillCahractor(#strs:[String])->String{
var result = self
while( true ){
var findAtleastOne = false
for str in strs {
var found:Bool = false
(result, found) = result.escapeHeadStr(str)
if found {
findAtleastOne = true
break //for循环
}
}
if findAtleastOne == false {
break
}
}
return result as String
}
func reverse()->String{
var inReverse = ""
for letter in self {
println(letter)
inReverse = "\(letter)" + inReverse
}
return inReverse
}
func escapeHeadTailSpace()->String{
return self.escapeSpaceTillCahractor().reverse().escapeSpaceTillCahractor().reverse()
}
func stringEscapeHeadTail(#strs:[String])->String{
return self.escapeSpaceTillCahractor(strs:strs).reverse().escapeSpaceTillCahractor(strs:strs).reverse()
}
}
|