2 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
編輯:添加為什么我只是發(fā)布一個(gè)程序作為答案的說明。
我正在提出一個(gè)非常簡單的實(shí)現(xiàn),以解析您在問題中給出的文本。您接受了數(shù)學(xué)答案,這是可以的。不過,我想在他的回答中添加一些反論點(diǎn)。基本上,該答案中的偽代碼是我的答案中的代碼的不可編譯版本,因此我們同意該解決方案。
我不同意的是過度設(shè)計(jì)的談話。我每天都要處理思想過度的人編寫的代碼。我敦促您不要考慮模式,內(nèi)存和時(shí)間限制,否則將來誰可能想要這些。
訪客模式?那只是在解析編程語言時(shí)非常有用的東西,不要試圖從這個(gè)問題構(gòu)造一個(gè)用例。訪客模式用于遍歷其中包含不同類型事物的樹。在這里,我們列出了所有相同的東西,而不是一棵樹。
內(nèi)存和時(shí)間限制?您正在解析5 GB的文本嗎?那么這可能是一個(gè)真正的問題。但是,即使您這樣做,也要始終先寫最簡單的東西。足夠了。在我的整個(gè)職業(yè)生涯中,我只需要每年使用一次簡單數(shù)組之外的其他東西或應(yīng)用復(fù)雜算法。仍然到處都可以看到無緣無故地使用復(fù)雜數(shù)據(jù)結(jié)構(gòu)和算法的代碼。這使更改變得復(fù)雜,容易出錯(cuò),有時(shí)最終會(huì)使速度變慢!不要使用可觀察的列表抽象,只要它的內(nèi)容發(fā)生更改,它就會(huì)通知所有觀察者-但是,讓我們添加一個(gè)更新鎖定和解鎖,以便我們可以控制何時(shí)不通知所有人...否!不要沿著那條路線走。用一片。做你的邏輯。使所有內(nèi)容從上到下都易于閱讀。我不想從A跳到B再跳到C,追逐接口,跟隨吸氣劑最終找到的不是具體的數(shù)據(jù)類型,而是另一個(gè)接口。那不是要走的路。
這就是為什么我的代碼不導(dǎo)出任何內(nèi)容的原因,它是一個(gè)獨(dú)立的,可運(yùn)行的示例,是針對(duì)您的具體問題的具體解決方案。您可以閱讀它,很容易理解。它沒有被大量評(píng)論,因?yàn)樗恍枰辉u(píng)論。這三個(gè)評(píng)論不是說明會(huì)發(fā)生什么,而是說明為什么會(huì)發(fā)生。其他所有內(nèi)容都可以從代碼本身中看出。我故意留下有關(guān)潛在錯(cuò)誤的注釋。您知道自己擁有哪種數(shù)據(jù),那里沒有行會(huì)觸發(fā)此錯(cuò)誤。不要編寫代碼來處理不可能發(fā)生的事情。如果將來有人在冒號(hào)后添加一行沒有文本的行(請記住,沒有人會(huì)這樣做,不用擔(dān)心),這將引發(fā)恐慌,將您指向此行,然后添加另外的if或某物,你完成了。
我要延伸的主要觀點(diǎn)是:只寫解決當(dāng)前問題所需的內(nèi)容。除此之外的所有內(nèi)容都使您的程序難以閱讀和更改,它將未經(jīng)測試且不必要。
話雖如此,這是我的原始答案:
https://play.golang.org/p/T6c51jSM5nr
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
type item struct {
name string
educations []string
age int
}
var items []item
var current item
finishItem := func() {
if current.name != "" { // handle the first ever separator
items = append(items, current)
}
current = item{}
}
lines := strings.Split(code, "\n")
for _, line := range lines {
if line == separator {
finishItem()
} else {
colon := strings.Index(line, ":")
if colon != -1 {
id := line[:colon]
value := line[colon+2:] // note potential bug if text has nothing after ':'
switch id {
case "name":
current.name = value
case "Education":
current.educations = append(current.educations, value)
case "Age":
age, err := strconv.Atoi(value)
if err == nil {
current.age = age
}
}
}
}
}
finishItem() // in case there was no separator at the end
for _, item := range items {
fmt.Printf("%s, %d years old, has educations:\n", item.name, item.age)
for _, e := range item.educations {
fmt.Printf("\t%s\n", e)
}
}
}
const separator = "==================="
const code = `===================
name: John Doe
Education: High School Diploma
Education: Bachelor's Degree
Education: Sun Java Certified Programmer
Age: 29
===================
name: Bob Bear
Education: High School Diploma
Age: 18
===================
name: Jane Doe
Education: High School Diploma
Education: Bachelor's Degree
Education: Master's Degree
Education: AWS Certified Solution Architect Professional
Age: 25`
- 2 回答
- 0 關(guān)注
- 236 瀏覽
添加回答
舉報(bào)