? ? 由于業(yè)務(wù)需求,需要實(shí)現(xiàn)親友計(jì)算的功能.
1 . 直接采用匹配的方式.
看到需求時(shí),首先想到去網(wǎng)上查找了下,有沒有類似的demo.由于我是Android開發(fā),沒有找到相對(duì)應(yīng)源碼,然后就考慮自己動(dòng)手寫.我在Github上找到了使用js實(shí)現(xiàn)的demo,簡(jiǎn)單的了解了下實(shí)現(xiàn)原理:拿到需要計(jì)算的數(shù)值,做出相對(duì)應(yīng)的組合,例如:哥哥的哥哥,直接變成哥哥.然后把組合的結(jié)果,直接去匹配自己寫的表達(dá)式, 例如:爸爸的兒子的爸爸的爸爸 ?會(huì)直接組合成 ?爸爸的爸爸 ?然后去匹配 爸爸的爸爸是爺爺 ?這樣的方式.然后得出結(jié)果.但是這種組合方式至少有幾千種,而且性能很差.我要自己動(dòng)手寫,顯然很啰嗦,麻煩. ? ? ?
2 . ?分布計(jì)算
對(duì)于這種關(guān)系處理首先我想到的是采用兩種組合計(jì)算的方式,就是一步一步計(jì)算過去. ?例如 ?爸爸的哥哥的兒子的妻子 ? 我先計(jì)算爸爸的哥哥得出大伯,大伯的兒子得出堂哥或者堂弟然后妻子為堂嫂,堂弟媳.但是不能使用文字來匹配,不然太龐大了,想著對(duì)于每一個(gè)人都要一個(gè)數(shù)字來對(duì)應(yīng),就是我代表0,爸爸代表1,媽媽代表2... 把所有的?親戚關(guān)系都以一個(gè)數(shù)字來代替,我還很聰明的把男的用作單數(shù),他的妻子用著雙數(shù),這樣對(duì)于一個(gè)人的妻子或者丈夫就直接可以使用+1,-1來計(jì)算了.當(dāng)然這些只是思路,按照這個(gè)邏輯關(guān)系繼續(xù)思考的話,會(huì)發(fā)現(xiàn)并不比第一種方式容易.因?yàn)槊恳粋€(gè)關(guān)系都有幾種計(jì)算方式,對(duì)于每個(gè)代表的數(shù)值都需要進(jìn)行幾種計(jì)算,就是對(duì)于1(爸爸),我需要算出他的兄弟姐妹,父母,子女和自己的關(guān)系,2(媽媽)一樣還是要把所有的情況列舉出來.繁瑣程度不亞于第一種情況,而且還會(huì)有很多不健全的地方,例如 爸爸的兒子的妻子 ? ?答案有三個(gè) ?嫂子,弟媳,老婆. ?如果在遠(yuǎn)一點(diǎn) 爸爸的爸爸的兒子的兒子的老婆 ?則有 嫂子,弟媳,老婆,堂嫂,堂弟媳.這種方式完全不能實(shí)現(xiàn).
3.直接計(jì)算.
爺爺?shù)膶O媳婦有嫂子,弟媳,老婆,堂嫂,堂弟媳 ,爸爸的兒媳有嫂子,弟媳,老婆 ,看到這里時(shí),突然一個(gè)新的思路出現(xiàn)了,對(duì)于一個(gè)人或者說一個(gè)身份來說,他的后代的叫法都是一致的,我哥哥的下一代一定是我的侄輩,男的是侄子,女的是侄女.我姐姐的是兒子是外甥,女兒是外甥女.我大伯的兒子一定是我的堂哥或者堂弟,你要計(jì)算某個(gè)人和你的關(guān)系,你就必須要和他有關(guān)系,和你有關(guān)系的只有父母,?子女,丈夫,妻子.而你的爺爺,或者大伯,舅舅是因?yàn)楹湍愕母篙呌嘘P(guān)系才和你連接上的.所以你們一定有一條線連接起來,這樣我只要知道,這條線的最高點(diǎn),需要計(jì)算的這個(gè)人和我兩直接的差距就可以了.線的最高點(diǎn)是什么意思了,舉個(gè)例子:? 爸爸的哥哥的兒子? 最高點(diǎn)就是爸爸的哥哥也就是大伯,? 爸爸的爸爸的兒子? 最高點(diǎn)就是爸爸的爸爸也就是爺爺? 也就是需要計(jì)算的那個(gè)輩分最高的人,而我們的差距就是你?是什么輩分 ?,我把自己一輩定義為0代, 爸爸 , 媽媽,大伯,舅舅...定義為1代,爺爺2代,兒子,侄子,堂侄-1代...? 爸爸的兄弟的兒子? 最高點(diǎn)爸爸的哥哥就是大伯 ,他的兒子0代,和我同代,那肯定就是堂哥,堂弟了? ? 爸爸的爸爸的兒子 最高點(diǎn)是爺爺 ?他的兒子輩分是1輩 就是你父輩,那就只要爸爸,叔叔,大伯. ?只要定義兩個(gè)變量,一個(gè)來記錄當(dāng)前人的輩分,出現(xiàn)父母就+1,兒女就-1,另外一個(gè)變量來記錄最高點(diǎn),結(jié)果就是根據(jù)最高點(diǎn)然后計(jì)算他的后輩就行了.需要注意的是,在計(jì)算前,需要對(duì)值先進(jìn)行整合, ?就是哥哥的哥哥 直接整合成哥哥 ? xxx的兒子的爸爸一定是xxx(xxx是男性)或者xxx的老公(xxx是女性)....,需要把所有的誘惑,或者這種不必要的給整合起來. ?計(jì)算時(shí),要注意除了你的配偶或者你的?直系親屬的兄弟姐妹和你有關(guān)系,其他人的配偶的兄弟姐妹和你都沒關(guān)系 ?,就像你大嫂的兄弟姐妹和你沒有關(guān)系,需要做好這方面的判斷. ?還有爺爺?shù)膶O輩一定是你父親的子輩和?父親兄弟的子輩. ? ? ?還需要注意出現(xiàn)最高點(diǎn)是爺爺,這個(gè)人和你同輩,但是可能是你爺爺?shù)膬鹤雍筝?也可能是你爺爺女兒的后輩.把這些處理好了,也就差不多了,
寫的有點(diǎn)簡(jiǎn)單,只是個(gè)邏輯思考過程.就是一個(gè)思路而已.