【问题标题】:Groovy sort colors of the rainbow彩虹的 Groovy 排序颜色
【发布时间】:2011-10-18 23:47:34
【问题描述】:

鉴于彩虹颜色的顺序完全一样:ROYGBIV(R=red、O=orange、Y=yellow、G=green、B=blue、I=indigo 和 V=violet)我该如何选择列表:

def partialUnorderedList =["orange", "blue", "red","green"] 

并将其排序为 ROYGBIV 顺序,结果为:

def  partialOrderedList = ["red", "orange", "green", "blue"]

【问题讨论】:

    标签: sorting groovy


    【解决方案1】:

    这是我对这个问题的看法:

    def order = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]
    def input = ["orange", "blue", "red", "green"]
    
    def sorted = input.sort { order.indexOf it }
    

    它使用输入列表中给定元素在参考列表中的索引位置作为排序标准。

    【讨论】:

    • 有人能告诉我indexOf 是从哪里来的order吗?
    • 谢谢克里斯托夫。这也是我想出的确切解决方案。另一个有趣的选择是使用 Enum,另一个是 Map。有没有人愿意提供一些额外的积分? :)
    【解决方案2】:

    这是解决您问题的最简单方法:

    def a =["red","orange","yellow","green","blue","indigo","violet"]
    def input = ["orange", "blue", "red","green"]
    list = []
    for(i=0;i<input.size();i++)
    {
       index =  a.findIndexValues{ it ==  input[i]}.join() as Integer
       list[index] =  input[i]
    }
    println list.minus(null)
    

    输出:

    [red, orange, green, blue]
    

    对于其他输入:

    [yellow, red, blue, orange, violet, indigo]
    

    它输出:

    [red, orange, yellow, blue, indigo, violet]
    

    在上面的代码中使用了findIndexValues

    【讨论】:

      【解决方案3】:

      如果您不介意引入另一个库,Google Guava API 可能非常适合解决此问题。

      def partialUnorderedList = ["orange", "blue", "red", "green"] 
      Ordering roygbivOrdering = Ordering.explicit("red", "orange", "yellow", "green", "blue", "indigo", "violet")
      def partialOrderedList = roygbivOrdering.sortedCopy(partialUnorderedList)
      

      【讨论】:

        【解决方案4】:

        一个简单的解决方案是使用闭包进行比较,如下所示:

        def partialUnorderedList =["orange", "blue", "red","green"]
        
        def order = "roygbiv".inject([:]){ map, letter -> map[letter] = map.size(); map}
        def sortedList = partialUnorderedList.sort{ a, b ->
            order[a[0].toLowerCase()] <=> order[b[0].toLowerCase()]
        }
        

        这将为颜色的第一个字母创建索引的哈希映射。然后排序方法查找第一个方法的索引,并进行比较。

        这仅在您使用唯一的首字母时才有效。要对全名进行排序,您可以执行以下操作:

        def partialUnorderedList =["orange", "blue", "red","green"]
        
        def order = "red,orange,yellow,green,blue,indigo,violet".split(",").inject([:]){ map, name -> map[name] = map.size(); map}
        def sortedList = partialUnorderedList.sort{ a, b ->
            order[a.toLowerCase()] <=> order[b.toLowerCase()]
        }
        

        【讨论】:

          猜你喜欢
          • 2020-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-10
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          • 2019-09-03
          相关资源
          最近更新 更多