|
|
|
發新文章 |
|
|
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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
直接給一段調用實例:@import url(http://www.shnenglu.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()
}
}
|