题解 | #简单错误记录#

简单错误记录

http://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb

package main

import (
	"container/list"
	"fmt"
	"strings"
)

type ErrorMap struct {
	keys   map[string]*list.Element
	errors *list.List
}

type errEntry struct {
	last16Str  string
	lineNumber string
	errorCount int
}

func (eMap *ErrorMap) Add(entry *errEntry) {

	if elem, ok := eMap.keys[entry.last16Str+"_"+entry.lineNumber]; ok {
		e := elem.Value.(*errEntry)
		e.errorCount++
	} else {
		elem = eMap.errors.PushBack(entry)
		eMap.keys[entry.last16Str+"_"+entry.lineNumber] = elem
	}

	if eMap.errors.Len() > 8 {
		//elem := eMap.errors.Front()
		// 循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
		// 所以不用删除记录 keys 记录的值
		//e := elem.Value.(*errEntry)
		//delete(eMap.keys, e.last16Str+"_"+e.lineNumber)
		eMap.errors.Remove(eMap.errors.Front())
	}
}

func (eMap *ErrorMap) Print() {
	elem := eMap.errors.Front()
	for elem != nil {
		entry := elem.Value.(*errEntry)
		fmt.Printf("%s %s %d\n", entry.last16Str, entry.lineNumber, entry.errorCount)
		elem = elem.Next()
	}
}

func main() {

	errMap := &ErrorMap{
		keys:   map[string]*list.Element{},
		errors: list.New(),
	}
	var (
		errStr, line string
	)
	for {

		_, err := fmt.Scanf("%s %s\n", &errStr, &line)
		if err != nil || len(errStr) == 0 {
			break
		}

		strs := strings.Split(errStr, "\\")
		if err != nil {
			break
		}

		lastNum := len(strs[len(strs)-1])
		start := 0
		if lastNum >= 16 {
			start = lastNum - 16
		}
		errMap.Add(&errEntry{
			lineNumber: line,
			last16Str:  strs[len(strs)-1][start:],
			errorCount: 1,
		})
	}
	errMap.Print()
}

全部评论

相关推荐

01-02 00:50
三峡大学 Java
程序员牛肉:这简历一出手就离失业不远了。 作为一家公司来讲,我如果要招日常实习生,那我对实习生最基本的要求就是要能干活,毕竟你就待三四个月,谁会留心培养你? 那么除了院校之外,最重要的就是项目和实习了。没有实习的话项目就好好搞。 但是你说你这个项目吧:课程作业管理系统和TMS运输管理系统。这两个基本就和闹着玩差不多。 你作为一个想要应聘Java开发实习生的人,对后端的理解还仅仅停留在:“使用mapper和sql映射”,“使用SQL进行多表调用”,“基于MySQL简历表结构”,“基于Spring boot完成CURD操作”这种玩具上......... 找不到后端实习的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务