2016-12-02 33 views
0

我创建使用去lang.My结构的许可申请排序如下:在golang

Leave struct { 
     Leaveid  int 
     Name  string 
     EmployeeId string 
     Applieddate time.Time 
     Leavestatus string 
    } 

处理,批准,拒绝,HRApproved,HrDenied,HrProcessing之间休假状况各不相同。
一般来说,假期排序顺序必须基于应用日期。
我必须先能够显示Processing和HRProcessing,以及其他状态类型。

我想是这样的

 [ 
      { 
      "Leaveid": 4, 
      "Name": "rajesh", 
      "EmployeeId": "rajesh", 
      "Applieddate": "2016-12-02T08:59:02.870882+08:00", 
      "Leavestatus": "HRProcessing" 
      }, 
      { 
      "Leaveid": 1, 
      "Name": "rajesh", 
      "EmployeeId": "rajesh", 
      "Applieddate": "2016-12-02T07:30:01.679636+08:00", 
      "Leavestatus": "Processing" 
      }, 
{ 
      "Leaveid": 3, 
      "Name": "rajesh", 
      "EmployeeId": "rajesh", 
      "Applieddate": "2016-12-02T07:00:02.870882+08:00", 
      "Leavestatus": "HRProcessing" 
      }, 
     { 
      "Leaveid": 5, 
      "Name": "rajesh", 
      "EmployeeId": "rajesh", 
      "Applieddate": "2016-12-02T10:00:11.139189+08:00", 
      "Leavestatus": "Approved" 
      }, 
      { 
      "Leaveid": 2, 
      "Name": "rajesh", 
      "EmployeeId": "rajesh", 
      "Applieddate": "2016-12-02T07:58:41.837666+08:00", 
      "Leavestatus": "HRApproved" 
      }, 

     ] 

更新:这是我一直在使用某种包装

func (sortleave leaveDetails) Len() int { 
    return len(sortleave) 
} 
func (sortleave leaveDetails) Less(i, j int) bool { 
    if sortleave[i].Applieddate.After(sortleave[j].Applieddate) { 
     return true 
    } 
    if sortleave[i].Applieddate.Before(sortleave[j].Applieddate) { 
     return false 
    } 
    return sortleave[i].Leavestatus > sortleave[j].Leavestatus 
} 
func (sortleave leaveDetails) Swap(i, j int) { 
    sortleave[i], sortleave[j] = sortleave[j], sortleave[i] 
} 

输出完成:

[ 
    { 
    "Leaveid": 2, 
    "Name": "rajesh", 
    "EmployeeId": "rajesh", 
    "Applieddate": "2016-12-02T08:59:45.139189+08:00", 
    "Leavestatus": "HRProcessing" 
    }, 
    { 
    "Leaveid": 4, 
    "Name": "rajesh", 
    "EmployeeId": "rajesh", 
    "Applieddate": "2016-12-02T08:59:02.870882+08:00", 
    "Leavestatus": "HRApproved" 
    }, 
    { 
    "Leaveid": 3, 
    "Name": "rajesh", 
    "EmployeeId": "rajesh", 
    "Applieddate": "2016-12-02T08:58:41.837666+08:00", 
    "Leavestatus": "Processing" 
    }, 
    { 
    "Leaveid": 1, 
    "Name": "rajesh", 
    "EmployeeId": "rajesh", 
    "Applieddate": "2016-12-01T18:10:01.679636+08:00", 
    "Leavestatus": "Processing" 
    } 
] 

这里处理进入下来和HRApproved上涨。但这不是我想要的。请帮我解决这个问题。谢谢

+3

你有什么尝试,你坚持什么部分?你看过sort std库包中的例子吗? – superfell

+0

我已经尝试了排序包来做到这一点,但结果并不是我的预期。我会更新我做的。请纠正我,如果我错了。谢谢... –

+0

您正在寻找哪种排序? – neclepsio

回答

1

你需要先通过LeaveStatus进行排序,然后applieddate,但是leavestatus是一组枚举而不是alpha排序,所以你会想让这个状态变为状态,看看它们是否一样,如果是,按日期排序,否则按状态排序。像

func (d leaveDetails) Less(i, j int) bool { 
    status := func(l Leave) int { 
     if l.Leavestatus == "Processing" || l.Leavestatus == "HRProcessing" { 
      return 1 
     } 
     return 2 
    } 
    a := status(d[i]) 
    b := status(d[j]) 
    if a == b { 
     return d[i].Applieddate.After(d[j].Applieddate) 
    } 
    return a<b 
} 
+0

谢谢。这是我需要的。 –

0

定义Leavestatusstring似乎非常低效的,因为你需要做字符串比较和复制结构涉及复制Leavestatus即使它只是一个“枚举”般的类型。这也使得更容易引入基于错字的错误,因为编译器无法检查你是否正确输入了字符串。

我会为Leavestatus做一个基于int的类型,例如, LeaveStatus

type LeaveStatus int 

const (
    _ = iota 
    Processing 
    HRProcessing 
    HRApproved 
) 

然后你就可以有String()方法的类型:

func (s LeaveStatus) String() string { 
    switch(s) { 
     case Processing: 
      return "Processing" 
     case HRProcessing: 
      return "HRProcessing" 
     case Approved: 
      return "Approved" 
     default: 
      panic("O_O") 
    } 
} 

由于LeaveStatus是一种基于数字型,现在,你可以比较你的Less()实现使用<>运营商领域。