回答編集履歴

3

追記

2019/11/14 03:43

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -183,3 +183,15 @@
183
183
  }
184
184
 
185
185
  ```
186
+
187
+
188
+
189
+ もちろんこの例だといくつか問題が残っています。
190
+
191
+ - Cellのキーが実際の表示列かどうかが無視される。
192
+
193
+ - nilを埋めるのが面倒かつ正確さが求められる。
194
+
195
+
196
+
197
+ これらの解決にはcellsをスライスではなくmapで持つと良いでしょう。

2

修正

2019/11/14 03:43

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  実装の例を挙げてみます。
28
28
 
29
- https://play.golang.org/p/x6HIoGWhosE
29
+ [https://play.golang.org/p/lao9Q2qP4Ot](https://play.golang.org/p/lao9Q2qP4Ot)
30
30
 
31
31
  ```go
32
32
 
@@ -176,7 +176,7 @@
176
176
 
177
177
  }
178
178
 
179
- fmt.Println()
179
+ fmt.Println(strings.Join(line, ","))
180
180
 
181
181
  }
182
182
 

1

修正と追記

2019/11/14 03:32

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -1,9 +1,185 @@
1
1
  cellsの定義型「[]Cell」はスライスなので、省略したセルはそのセルの存在そのものがない扱いになります。
2
2
 
3
- つまり「"a","b","c","d"」の"b"を省略すればただの「"a","c","d"」という3つの値を持つスライスになります。
3
+ つまり「1,2,3,4」の2を省略すればただの「1,3,4」という3つの値を持つスライスになります。
4
4
 
5
5
 
6
6
 
7
+ **なのであなたの書いたスライスをコンマ区切りで順に出力だと「1,3,4」になるのは当然なのです**
8
+
9
+
10
+
7
- ここであなたが期待しているのは「"a","","c","d"」ということなので、
11
+ ここであなたが期待しているのは「1,,3,4」ということなので、
8
12
 
9
13
  データ初期化の段階で値のないセルにも初期値(値が空のCell)を与えれば良いということです。
14
+
15
+
16
+
17
+ あと、キーの一覧はデータ全体をスキャンしないと不定なので
18
+
19
+ 予めキーの一覧を取得するという処理が必要になります。
20
+
21
+
22
+
23
+ 値が空のCellをポインタ型で表現するとnilで表現できます。
24
+
25
+
26
+
27
+ 実装の例を挙げてみます。
28
+
29
+ https://play.golang.org/p/x6HIoGWhosE
30
+
31
+ ```go
32
+
33
+ package main
34
+
35
+
36
+
37
+ import (
38
+
39
+ "fmt"
40
+
41
+ "strings"
42
+
43
+ )
44
+
45
+
46
+
47
+ type Cell struct {
48
+
49
+ key string
50
+
51
+ value int
52
+
53
+ }
54
+
55
+
56
+
57
+ type Row struct {
58
+
59
+ cells []*Cell
60
+
61
+ }
62
+
63
+
64
+
65
+ func keys(hoge []Row) []string {
66
+
67
+ uniq := map[string]bool{}
68
+
69
+ res := []string{}
70
+
71
+ for _, r := range hoge {
72
+
73
+ for _, c := range r.cells {
74
+
75
+ if c == nil {
76
+
77
+ continue
78
+
79
+ }
80
+
81
+ if !uniq[c.key] {
82
+
83
+ uniq[c.key] = true
84
+
85
+ res = append(res, c.key)
86
+
87
+ }
88
+
89
+ }
90
+
91
+ }
92
+
93
+ return res
94
+
95
+ }
96
+
97
+
98
+
99
+ func main() {
100
+
101
+ row1 := Row{
102
+
103
+ []*Cell{
104
+
105
+ &Cell{"a", 1},
106
+
107
+ &Cell{"b", 2},
108
+
109
+ &Cell{"c", 3},
110
+
111
+ nil,
112
+
113
+ },
114
+
115
+ }
116
+
117
+
118
+
119
+ row2 := Row{
120
+
121
+ []*Cell{
122
+
123
+ &Cell{"a", 1},
124
+
125
+ &Cell{"b", 2},
126
+
127
+ &Cell{"c", 3},
128
+
129
+ &Cell{"d", 4},
130
+
131
+ },
132
+
133
+ }
134
+
135
+
136
+
137
+ row3 := Row{
138
+
139
+ []*Cell{
140
+
141
+ &Cell{"a", 1},
142
+
143
+ nil,
144
+
145
+ &Cell{"c", 3},
146
+
147
+ &Cell{"d", 4},
148
+
149
+ },
150
+
151
+ }
152
+
153
+
154
+
155
+ hoge := []Row{row1, row2, row3}
156
+
157
+
158
+
159
+ fmt.Println(strings.Join(keys(hoge), ","))
160
+
161
+ for _, r := range hoge {
162
+
163
+ line := []string{}
164
+
165
+ for _, c := range r.cells {
166
+
167
+ if c == nil {
168
+
169
+ line = append(line, "")
170
+
171
+ } else {
172
+
173
+ line = append(line, fmt.Sprintf("%d", c.value))
174
+
175
+ }
176
+
177
+ }
178
+
179
+ fmt.Println()
180
+
181
+ }
182
+
183
+ }
184
+
185
+ ```