草庐IT

在 golang 中排序

coder 2024-07-07 原文

我正在使用 go lang 创建一个请假申请。我的结构如下

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

请假状态在 Processing、Approved、Denied、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"
          },

        ]

Update:This is what i have done using sort package

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"
  }
]

这里 Processing 下降,HRApproved 上升。但这不是我想要的。请帮助我解决这个问题。谢谢

最佳答案

您需要先按 Leavestatus 排序,然后再按申请日期排序,但 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
}

关于在 golang 中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40923603/

有关在 golang 中排序的更多相关文章

  1. ruby-on-rails - 如何在记录更新期间从验证中排除密码字段? ( rails 3.0.4, ruby 1.9.2) - 2

    我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>

  2. ruby - 如何从 rubocop 中排除全局变量? - 2

    我想从rubocop中排除一个全局变量,但我找不到规则名称。我尝试添加GlobalVars:Exclude:-redis到.rubocop.yml但运气不好。错误说不要引入全局变量。 最佳答案 使用AllowedVariables切换Exclude. 关于ruby-如何从rubocop中排除全局变量?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44004319/

  3. ruby-on-rails - 从 Ruby on Rails 中的 collection.map 中排除选项? - 2

    我有这样一行:{:value=>(policy_address.state.namerescuenil)},:required=>true,:collection=>states.map{|s|[s.name,s.id]},:include_blank=>'Pleaseselect'%>我想从states.map集合中排除一个值。我认为这行得通,但行不通:{:value=>(policy_address.state.namerescuenil)},:required=>true,:collection=>states.map{|s|[s.name,s.id]unlesss.name==

  4. arrays - 过滤以从数组中排除元素 - 2

    尝试从数组中过滤一些条目。不能保证它们在master数组中,所以我正在通过迭代进行测试。total=['alpha','bravo','charlie','delta','echo']hide=['charlie','echo']pick=[]foriintotalif!hide.include?(i)putsipick.push(i)endendputspick这是行不通的。有没有更好的方法来提供这种过滤器? 最佳答案 Ruby允许您在两个数组上使用公共(public)实例方法来获取它们的相交或互斥元素:a1=['alpha','

  5. ruby-on-rails - 如何使用 Rspec 检查 ActiveJob 中排队的内容 - 2

    我正在RailsAPI应用程序中使用reset_password方法。当这个端点被命中时,一个ActiveJob被排队,它将触发对Mandrill(我们的交易电子邮件客户端)的请求。我目前正在尝试编写测试以确保在命中Controller端点时ActiveJob正确排队。defreset_password@user=User.find_by(email:params[:user][:email])@user.send_reset_password_instructionsendsend_reset_password_instructions在创建代码如下的ActiveJob之前创建一些u

  6. javascript - 在 jQuery ($.Deferred) 中排队可选的 AJAX/函数调用? - 2

    我希望在JavaScript/jQuery中对任意数量的可能可选的函数调用进行排队。例如,在运行第二个(或第三个、第四个等)函数或AJAX调用之前,我可能需要确保用户已通过身份验证并设置了cookie。我研究了使用最近添加的jQuery.Deferred来执行此操作,但发现触发调用的顺序无关紧要(真正的异步样式)。另外,我读到一旦Deferred实例被解析,就不可能取消解析它。这就是我目前所处的位置。最初,我考虑将Deferred实例设置为已解析,然后在堆栈中出现可选函数时取消解析它。vard=$.Deferred(),chained=d,d.resolve(),div=extra.f

  7. javascript - 从 jQuery 选择器中排除具有特定属性的元素 - 2

    我正在使用这个javascript在聚焦时清空输入/文本区域。$(document).ready(function(){$('input[type="text"],textarea').not('[readonly="readonly"]').addClass("idleField");$('input[type="text"],textarea').focus(function(){$(this).removeClass("idleField").addClass("focusField");if(this.value==this.defaultValue){this.value='

  8. javascript - 如何在 tsconfig.json 中排除以 '.spec.ts' 结尾的文件 - 2

    我试图在我的tsconfig.json中包含一些文件,但它包含了我不想包含的文件。从repo协议(protocol)(带有未编译的源代码)我试图包含以.ts结尾的文件,除了那些以.spec.ts结尾的.下面包含了我想要的文件,但是没有成功排除我不要的文件。"include":["node_modules/dashboard/**/*.ts"],"exclude":["node_modules/dashboard/**/*.spec.ts"],(然后)新的Unixglob模式/字符串,我需要一些来正确匹配和排除文件,然后如何将它们添加到配置中。 最佳答案

  9. javascript - 从 jQuery 可拖动句柄中排除项目 - 2

    我有一个可拖动的与overflow设置为auto当内容太宽时显示滚动条。我想要的全部内容可以拖动,所以我没有添加句柄。现在,当我尝试拖动滚动条时,整个被拖动而不是滚动内容。有没有办法从可拖动的句柄中排除元素在jQuery中?我需要这样的东西:$("#element").draggable({handle:"not(#thisTable)"})有没有办法用选择器或类似的东西来做到这一点? 最佳答案 谢谢你的回答,但我发现我认为更好的解决方案....可拖动还有另一个选项,称为“取消”,它从可拖动元素的句柄中排除所选元素...$('#co

  10. javascript - Jquery 在点击事件中排除第一个 td? - 2

    如何排除我在下面创建的jquery的点击事件中的第一个td?我想排除生成对话框的单击事件中所有第一个td行。jQuery("#listtbodytr").click(function(){//somecodehere});firstfirst 最佳答案 如何使用first-child选择器结合:not:jQuery("#listtbodytrtd:not(:first-child)").click(function(){//somecodehere});示例:http://jsfiddle.net/Rq8Xf/

随机推荐