请问go语言里的list应该怎么使用?
golang吧
全部回复
仅看楼主
level 2
如题 新手。。因为要做作业接触go语言
2014年03月28日 07点03分 1
level 2
func Map(value string) *list.List {
}
2014年03月28日 07点03分 2
level 2
就是要返回一个list 那应该怎么样创建list和把值写入list呢?
2014年03月28日 07点03分 3
level 2
。。
2014年03月28日 07点03分 4
,,
2014年03月28日 07点03分
level 11
package main
import (
"container/list"
"fmt"
"strings"
)
func main() {
items := list.New()
for _, x := range strings.Split("ABCDEFGH", "") {
items.PushFront(x)
}
items.PushBack(9)
for element := items.Front(); element != nil; element = element.Next() {
switch value := element.Value.(type) {
case string:
fmt.Printf("%s ", value)
case int:
fmt.Printf("%d ", value)
}
}
fmt.Println()
}
2014年03月28日 08点03分 5
大神能留个qq之类的嘛?我真心在周围找不到会go的 然后我这个作业又还有一些东西看不懂 …网上查的也一知半解…
2014年03月28日 08点03分
回复 嚣张的瓶瓶 :直接在吧里说。
2014年03月28日 08点03分
level 2
for r := 0; r < nreduce; r++ {
file, err = os.Create(ReduceName(fileName, JobNumber, r))
if err != nil {
log.Fatal("DoMap: create ", err);
}
enc := json.NewEncoder(file)
for e := res.Front(); e != nil; e = e.Next() {
kv := e.Value.(KeyValue)
if hash(kv.Key) % uint32(nreduce) == uint32(r) {
err := enc.Encode(&kv);
if err != nil {
log.Fatal("DoMap: marshall ", err);
}
}
}
2014年03月28日 08点03分 6
@森宫苍乃 这个循环细节不太懂。。那个hash是kv.Key在list里的序号吗? 还有json这个语句不太明白 还有底下的err是用来停止写文件?
2014年03月28日 08点03分
回复 嚣张的瓶瓶 :这是一个函数里的 如果需要的话 我可以把整个函数贴上来
2014年03月28日 08点03分
回复 嚣张的瓶瓶 :我们的作业是要求补完一个简单的mapreduce算法中的map函数和reduce函数 可是之前没学过go 所以不太在行
2014年03月28日 08点03分
回复 嚣张的瓶瓶 :整个。
2014年03月28日 08点03分
level 2
func DoMap(JobNumber int, fileName string,
nreduce int, Map func(string) *list.List) {
name := MapName(fileName, JobNumber)
file, err := os.Open(name)
if err != nil {
log.Fatal("DoMap: ", err);
}
fi, err := file.Stat();
if err != nil {
log.Fatal("DoMap: ", err);
}
size := fi.Size()
fmt.Printf("DoMap: read split %s %d\n", name, size)
b := make([]byte, size);
_, err = file.Read(b);
if err != nil {
log.Fatal("DoMap: ", err);
}
file.Close()
res := Map(string(b))
// XXX a bit inefficient. could open r files and run over list once
for r := 0; r < nreduce; r++ {
file, err = os.Create(ReduceName(fileName, JobNumber, r))
if err != nil {
log.Fatal("DoMap: create ", err);
}
enc := json.NewEncoder(file)
for e := res.Front(); e != nil; e = e.Next() {
kv := e.Value.(KeyValue)
if hash(kv.Key) % uint32(nreduce) == uint32(r) {
err := enc.Encode(&kv);
if err != nil {
log.Fatal("DoMap: marshall ", err);
}
}
}
file.Close()
}
}
2014年03月28日 08点03分 7
@森宫苍乃 第一步就是要写出Map函数
2014年03月28日 08点03分
level 2
func RunSingle(nMap int, nReduce int, file string,
Map func(string) *list.List,
Reduce func(string,*list.List) string) {
mr := InitMapReduce(nMap, nReduce, file, "")
mr.Split(mr.file)
for i := 0; i < nMap; i++ {
DoMap(i, mr.file, mr.nReduce, Map)
}
for i := 0; i < mr.nReduce; i++ {
DoReduce(i, mr.file, mr.nMap, Reduce)
}
mr.Merge()
}
2014年03月28日 08点03分 8
@森宫苍乃 这个是要运行的函数
2014年03月28日 08点03分
level 11
那个hash是kv.Key在list里的序号吗?
hash是用来计算哈希值的函数。
还有json这个语句不太明白 还有底下的err是用来停止写文件?
不知道你说的是哪里。
2014年03月28日 08点03分 9
hash(kv.Key) % uint32(nreduce) == uint32(r)
2014年03月28日 08点03分
enc := json.NewEncoder(file)
2014年03月28日 08点03分
err := enc.Encode(&kv);
2014年03月28日 08点03分
回复 嚣张的瓶瓶 :NewEncoder(file)根据文件创建一个JSON编码器,Encode(&kv)把kv编码为json格式保存到文件里。
2014年03月28日 09点03分
level 2
func DoReduce(job int, fileName string, nmap int,
Reduce func(string,*list.List) string) {
kvs := make(map[string]*list.List)
for i := 0; i < nmap; i++ {
name := ReduceName(fileName, i, job)
fmt.Printf("DoReduce: read %s\n", name)
file, err := os.Open(name)
if err != nil {
log.Fatal("DoReduce: ", err);
}
dec := json.NewDecoder(file)
for {
var kv KeyValue
err = dec.Decode(&kv);
if err != nil {
break;
}
_, ok := kvs[kv.Key]
if !ok {
kvs[kv.Key] = list.New()
}
kvs[kv.Key].PushBack(kv.Value)
}
file.Close()
}
var keys []string
for k := range kvs {
keys = append(keys, k)
}
sort.Strings(keys)
p := MergeName(fileName, job)
file, err := os.Create(p)
if err != nil {
log.Fatal("DoReduce: create ", err);
}
enc := json.NewEncoder(file)
for _, k := range keys {
res := Reduce(k, kvs[k])
enc.Encode(KeyValue{k, res})
}
file.Close()
}
2014年03月28日 11点03分 10
@森宫苍乃 请问kvs := make(map[string]*list.List)这里面的map是什么?是一个映射关系吗?
2014年03月28日 11点03分
kvs[kv.Key].PushBack(kv.Value)还有这个。。。是将kv.Value写入到kvs[kv.Key]的对应条目里?
2014年03月28日 12点03分
回复 嚣张的瓶瓶 :map是Go语言里的字典类型,map[string]*list.List表示以string为键、list.List为值的字典。
2014年03月28日 12点03分
回复 森宫苍乃 :T T你还在 真感动 太感谢你了 不过可能一会还得麻烦你 我再继续琢磨琢磨
2014年03月28日 12点03分
1