이것은 훌륭한 "왜 맵 프린트가 순서가 틀린 것인가"라는 질문의 변형입니다.지도를 순서대로 반복 할 수있는 쉬운 방법이 있습니까?
map[MyKey]MyValue
형태의지도가 상당히 많습니다. MyKey
및 MyValue
은 (일반적으로) 구조체입니다. 모든 키 유형에 대해 "적은"기능을 제공합니다.
지도를 순서대로 반복해야합니다. (. 특히, 순서는 해당 유형에 덜 함수로 정의) 지금, 내 코드는 다음과 같습니다 : 다음
type PairKeyValue struct {
MyKey
MyValue
}
type PairKeyValueSlice []Pair
func (ps PairKeyValueSlice) Len() int {
return len(ps)
}
func (ps PairKeyValueSlice) Swap(i,j int) {
ps[i], ps[j] = ps[j], ps[i]
}
func (ps PairKeyValueSlice) Less(i,j int) {
return LessKey(ps[i].MyKey, ps[j].MyKey)
}
func NewPairKeyValueSlice(m map[MyKey]MyValue) (ps PairKeyValueSlice) {
ps = make(PairKeyValueSlice, len(m))
i := 0
for k,v := range m {
ps[i] = PairKeyValue{k,v}
i++
}
sort.Sort(ps)
}
그리고, 내가의 순서 반복을 원하는 시간, 그것은 같이 보인다 :
var m map[MyKey]MyValue
m = GetMapFromSomewhereUseful()
for _, kv := range NewPairKeyValueSlice(m) {
key := kv.MyKey
value := kv.MyValue
DoUsefulWork(key, value)
}
그리고 이것은 크게 작용하는 것처럼 보입니다. 문제는 그것이 매우 상세하다는 것입니다. 특히 수작업으로 발생하는 문제는 지시 된 맵을 함축하는 것과 거의 관련이 없으므로 실제로 루프의 유용한 작업에 관한 것입니다.
또한 여러 가지 키와 값 유형이 있습니다. 따라서 순서대로 맵을 반복 할 때마다 모든 코드를 복사/붙여 넣기하고 MyKey
을 새 키로 바꾸거나 MyValue
을 새 값으로 바꾸거나 바꾸십시오. 그 크기의 복사/붙여 넣기는 ... "냄새 나는". 이미 여러 번 오류를 수정했기 때문에 이미 번거 로움이 있습니다.
이 기술은 또한 모든 키와 값의 전체 복사본을 만들어야한다는 단점이 있습니다. 그건 바람직하지 않지만, 나는 그 주위에 방법이 보이지 않는다. (키로 만 줄일 수는 있지만 문제의 주요 특성은 바뀌지 않습니다.)
This question은 문자열과 동일한 것을 시도하고 있습니다. This question은 문자열과 int로 처리합니다. This question은 리플렉션을 사용해야 함을 의미하며 모든 사용자 정의 유형을 포함하여 가능한 모든 유형을 전환하는 switch 문을 가져야합니다.
그러나지도가 결정 론적으로 반복되지 않는다는 당혹감을 가진 사람들과 함께이 문제에 대한 더 나은 해결책이있는 것으로 보입니다. 나는 OO 백그라운드에서 왔으므로 근본적으로 뭔가 빠졌을 것입니다.
그래서 맵을 순서대로 반복하는 방법이 있습니까?
업데이트 : 이것보다 더 나은 솔루션있을 경우 소스에 대한 자세한 정보를 가지고 질문을 편집.
나는 출력을 위해 그룹화해야 할 많은 것들이 있습니다.
type ObjTypeTree struct {
Children map[Type]*ObjKindTree
TotalCount uint
}
type ObjKindTree struct {
Children map[Kind]*ObjAreaTree
TotalCount uint
}
type ObjAreaTree struct {
Children map[Area]*ObjAreaTree
TotalCount uint
Objs []*Obj
}
그럼,이 유형의 그룹을 인쇄 할 ObjTypeTree
의 자식들에 대해 반복 것 : 각 그룹화 수준은 다음과 같은 구조입니다. 각각의 경우에 대해 ObjKindTree
을 반복하여 종류 그룹을 인쇄합니다. 반복은 유형에 대한 메소드로 수행되며 각 유형의 유형은 그룹화 레벨을 인쇄하는 약간 다른 방법이 필요합니다. 그룹을 순서대로 인쇄해야 문제가 발생합니다.
정말 나쁜 해결책에 대해 우리 모두에게 말했습니다. 해결할 문제를 알려주십시오. 그러면 좋은 해결책을 제안 할 수 있습니다. – peterSO
그래, 해결하려고하는 문제에 대한 일부 정보를 편집했습니다. – alficles