![專案說明:用C++寫.exe檔來處理input的data input是.txt檔,data形式如下 1,[1]->[2]->[3]->[4]->[3]->[5] 2,[1]->[3]->[2]->[3]->[1] 3,[1]->[4]->[3]->[5]->[4]->[1] . . 逗號前是data序號,逗號後是user的網頁瀏覽路徑 []內是網頁的代號,視為字串即可,數字大小不代表順序 ->是箭頭,表示路徑順序 不同序號的路徑彼此獨立,不用考慮重複情形 我想要將user的瀏覽路徑切成向前與向後 向前指的是該user到目前為止瀏覽的網頁都未重複 向後指的是該user到目前為止瀏覽的網頁都有重複 方向改變的話就output,未改變的話就繼續算 以上例編號1的路徑來說明 原始是1,[1]->[2]->[3]->[4]->[3]->[5] 首先[1]->[2],[2]未曾出現於此路徑,故[1]->[2]是向前 再看[2]->[3],[3]未曾出現於此路徑,故[1]->[2]->[3]是向前 再看[3]->[4],[4]未曾出現於此路徑,故[1]->[2]->[3]->[4]是向前 接著[4]->[3],[3]已經出現過,故[4]->[3]是向後(方向改變了) 最後[3]->[5],[5]未曾出現於此路徑,故[3]->[5]是向前(方向改變) 所有筆數以此規則run完後 最後output兩個txt檔,一個是向前.txt,一個是向後.txt 向前.txt裡面就會是向後.txt裡面就會是 1,[1]->[2]->[3]->[4]1,[4]->[3] 1,[3]->[5]2,[2]->[3]->[1] 2,[1]->[3]->[2]3,[5]->[4]->[1] 3,[1]->[4]->[3]->[5]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_q4K1pMRUGnl6K6hs7XGCp6uTclJu21K8bJYa9BApTvH-7jTy_ZplpDDs58zORNqqfCNQ4DOhpXCH-mhGoGCWhXBASPTi9fqelJ28v1_3z4XrRd5z9tzwrT-zUwdhIJhm5F1NZetv36g/s400/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2012-08-02+%25E4%25B8%258A%25E5%258D%25888.51.35.png)

Split妙用~~
split[mystring_String]:=Block[{forward,backward,trans,transdata}, (* 將數字以外的字元刪除並轉換為陣列 *) trans=ToExpression@StringSplit[StringReplace[mystring,{"["|"]"->""}],"\[Rule]"]; (* 檢查數字是否為重複數字 *) transdata=Table[{trans[[z]],FreeQ[trans[[1;;z-1]],trans[[z]]]},{z,1,Length@trans}]; (* 檢查兩陣列資料的第二的元素是否為True,是的話歸為同一組 *) forward=Select[Split[transdata,#2[[2]]==True&],Length@#>1&][[All,All,1]]; (* 檢查兩陣列資料的第二的元素是否為False,是的話歸為同一組 *) backward=Select[Split[transdata,#2[[2]]==False&],Length@#>1&][[All,All,1]]; {forward,backward} ] data={{1,"[1]\[Rule][2]\[Rule][3]\[Rule][4]\[Rule][3]\[Rule][5]"}, {2,"[1]\[Rule][3]\[Rule][2]\[Rule][3]\[Rule][1]"}, {3,"[1]\[Rule][4]\[Rule][3]\[Rule][5]\[Rule][4]\[Rule][1]"}}; {#,split[data[[#,2]]]}&/@Range[Length@data]
讀者回應 ( 0 意見 )
訂閱發佈留言 (Atom)
發佈留言
Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.
如果這篇文章對你有幫助,那請留個訊息給我~