TheSwarm
unknown
golang
a year ago
3.2 kB
4
Indexable
package main
import (
	"encoding/json"
	"fmt"
	"os"
	"slices"
	"sort"
	"time"
)
func main() {
	var path = "C:\\Users\\ojpkm\\documents\\InterviewProject\\data.json"
	records := readData(path)
	SortNames(records)
	SortCompanies(records)
	BiggestCompany(records)
	MeasureWorkingTime(records)
}
// Customowy typ do parsowania daty na odpowiedni format
type CustomTime struct {
	*time.Time
}
// Metoda parsująca
func (t *CustomTime) UnmarshalJSON(b []byte) error {
	formattedTime, err := time.Parse(`"2006-01-02"`, string(b))
	t.Time = &formattedTime
	return err
}
// Struct trzymający dane z JSON'a
type Records struct {
	Name      string      `json:"name"`
	Company   string      `json:"company"`
	JobTitle  string      `json:"job_title"`
	StartedAt *CustomTime `json:"started_at"`
	EndedAt   *CustomTime `json:"ended_at,omitempty"`
}
// Odczyt danych z pliku JSON
func readData(path string) []Records {
	jsonFile, err := os.Open(path)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	defer jsonFile.Close()
	records := []Records{}
	jsonDec := json.NewDecoder(jsonFile)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	for jsonDec.More() {
		user := Records{}
		err = jsonDec.Decode(&user)
		if err != nil {
			fmt.Printf("err: %v\n", err)
		}
		records = append(records, user)
	}
	return records
}
// Alfabetyczne sortowanie nazwisk
func SortNames(records []Records) []string {
	names := []string{}
	for _, v := range records {
		if !slices.Contains(names, v.Name) {
			names = append(names, v.Name)
		}
	}
	sort.Strings(names)
	return names
}
// Alfabetyczne sortowanie firm
func SortCompanies(records []Records) []string {
	companies := []string{}
	for _, v := range records {
		if !slices.Contains(companies, v.Company) {
			companies = append(companies, v.Company)
		}
	}
	sort.Strings(companies)
	return companies
}
// Firma z największą ilością pracowników
func BiggestCompany(records []Records) string {
	someMap := map[string][]string{}
	for _, v := range records {
		if !slices.Contains(someMap[v.Company], v.Name) {
			someMap[v.Company] = append(someMap[v.Company], v.Name)
		}
	}
	var largestCompany string
	employeesAmount := 0
	for company, employees := range someMap {
		numEmployees := len(employees)
		if numEmployees > employeesAmount {
			employeesAmount = numEmployees
			largestCompany = company
		}
	}
	return largestCompany
}
// Funkcja zwracająca nazwisko pracownika z największą ilością przepracowanego czasu
func MeasureWorkingTime(records []Records) string {
	workingTime := make(map[string]time.Duration)
	for _, v := range records {
		if v.EndedAt == nil {
			now := time.Now()
			v.EndedAt = &CustomTime{Time: &now}
		}
		duration := v.EndedAt.Sub(*v.StartedAt.Time)
		if v.EndedAt.IsZero() {
			duration = time.Since(*v.StartedAt.Time)
		}
		workingTime[v.Name] += duration
	}
	var name string
	var longest time.Duration
	for i, v := range workingTime {
		if v > longest {
			name = i
			longest = v
		}
	}
	return name
}
// marek@theswarm.com
Editor is loading...
Leave a Comment