【问题标题】:Groovy method to get a random element from a listGroovy 方法从列表中获取随机元素
【发布时间】:2018-02-12 12:11:42
【问题描述】:

Groovy 是非常强大的集合管理功能。我有一个这样的列表:

def nameList = ["Jon", "Mike", "Alexia"]

我要做的是迭代 10 次以从第一个列表中获得 10 个具有随机名称的人。

10.times{
    Person person = new Person(
    name: nameList.get() //I WANT TO GET A RANDOM NAME FROM THE LIST
    )
}

这不起作用有两个明显的原因,我没有在 nameList.get 中添加任何索引,也没有创建 10 个不同的 Person 对象。

  1. 如何使用 groovy 从我的名单中获取随机元素?
  2. 我可以使用 groovy 的集合属性创建一个包含 10 个随机名称的人的列表(以简单的方式)吗?

【问题讨论】:

    标签: list grails random groovy


    【解决方案1】:

    只要使用Java方法Collections.shuffle()就好了

    class Person {
        def name
    }
    
    def nameList = ["Jon", "Mike", "Alexia"]
    10.times {
        Collections.shuffle nameList
        Person person = new Person(
            name: nameList.first()
        )
        println person.name
    }
    

    或使用随机索引,如

    class Person {
        def name
    }
    
    def nameList = ["Jon", "Mike", "Alexia"]
    def nameListSize = nameList.size()
    def r = new Random()
    10.times {
        Person person = new Person(
            name: nameList.get(r.nextInt(nameListSize))
        )
        println person.name
    }
    

    【讨论】:

    • 第一个建议是不是有点贵?
    • 并非如此。只是为了你,我做了一个快速的措施。我注释掉了println,因为它在两者中都是相同的,而且输出通常很昂贵,并将10 增加到100_000_000,使用System.currentTimeMillis() 来测量两种变体所需的时间。第一个需要 32 秒,第二个需要 30 秒,所以对于迭代恕我直言,差别不大。除此之外,如果您需要性能,请不要使用 Groovy,而是使用 Assembler。 ;-) 基本上它是 1. 更面向对象的版本与 2. 版本稍微像经常一样的性能。可能还有更快的,但没有被问到。
    • 不,无论使用哪种编程语言,第一个方法要慢得多:如果您获取 1000 个名称的列表并运行 100,000 次,第一种方法需要 3.6 秒,第二种方法需要 0.8 秒。这并不奇怪,因为第一个循环必须随机化列表中的所有元素,而第二个只有一个元素。
    • 好吧,正如我所说,通常它是更多面向对象的代码与更高的性能。并且 OP 没有说性能有多重要,所以我提供了两种选择。除此之外,您还可以洗牌一次,然后一个接一个地取,直到收集完并再次洗牌。但这在语义上略有不同,因为在集合用尽之前名称不会重复。
    • Collections.shuffle nameList 可以替换为nameList.shuffle()
    猜你喜欢
    • 2015-09-22
    • 2013-01-13
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多