【问题标题】:Simple ranking algorithm in GroovyGroovy 中的简单排名算法
【发布时间】:2010-06-01 14:52:45
【问题描述】:

我有一个简短的常规算法,用于根据食物的评级为食物分配排名。这可以在 groovy 控制台中运行。代码运行良好,但我想知道是否有更 Groovy 或功能性更强的方式来编写代码。如果可能的话,认为摆脱 previousItemrank 局部变量会很好。

def food = [
  [name:'Chocolate Brownie',rating:5.5, rank:null],
  [name:'Fudge', rating:2.1, rank:null],
  [name:'Pizza',rating:3.4, rank:null],
  [name:'Icecream', rating:2.1, rank:null],
  [name:'Cabbage', rating:1.4, rank:null]]

food.sort { -it.rating }

def previousItem = food[0]
def rank = 1
previousItem.rank = rank
food.each { item ->
  if (item.rating == previousItem.rating) {
    item.rank = previousItem.rank
  } else {
    item.rank = rank
  }
  previousItem = item
  rank++
}

assert food[0].rank == 1
assert food[1].rank == 2
assert food[2].rank == 3
assert food[3].rank == 3    // Note same rating = same rank
assert food[4].rank == 5    // Note, 4 skipped as we have two at rank 3

建议?

【问题讨论】:

    标签: algorithm groovy ranking


    【解决方案1】:

    这是我的解决方案:

    def rank = 1
    def groupedByRating = food.groupBy { -it.rating }
    groupedByRating.sort().each { rating, items ->
      items.each { it.rank = rank }
      rank += items.size()
    }
    

    【讨论】:

    • 感谢 groupBy 的想法,我是一个粉丝。但是我得到一个空指针,我认为与 sort() 调用有关。我通过内联 groupBy 并注入初始等级 1 来删除局部变量。 food.sort { -it.rating }.groupBy { it.rating }.inject(1) { rank, group -> def items = group.value items.each { it.rank = rank } rank += items.size() } (ugg,你如何在评论中格式化?)
    • 看起来 NullPointerException 是以前 Groovy 版本的错误。我可以用 Groovy 1.7.0 重现它。在 Groovy 1.7.2 中,代码按描述工作。
    【解决方案2】:

    我没试过,但也许这可行。

    food.eachWithIndex { item, i ->
        if( i>0 && food[i-1].rating == item.rating ) 
            item.rank = food[i-1].rank
        else
            item.rank = i + 1
    }
    

    【讨论】:

    • 感谢 Daniel,基于索引的方法看起来很干净,内联 sort { -it.rating } 调用使其符合我的“无本地 defs”要求。
    【解决方案3】:

    这是另一种不使用常规注入方法的“本地定义”的替代方法:

    food.sort { -it.rating }.inject([index: 0]) { map, current ->
        current.rank = (current.rating == map.lastRating ? map.lastRank : map.index + 1)
        [ lastRating: current.rating, lastRank: current.rank, index: map.index + 1 ]
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2017-06-08
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多