将属性添加到双类

时间:2014-11-23 22:02:05

标签: groovy

我正在运行一个聚类算法,该算法聚集了双打集合的集合。但是一旦完成聚类,我想知道每个Double属于哪个父类。

class PatientMRNA {
     Patient patient
     MRNA mrna
     Double value
}

我使用hql查询数据库,并将PatientMRNA表中的选定值放入Collection中,如下所示:

[[x11,x12...x1m],[x21,x22...x2m]...[xn1, xn2, xnm]]

此集合通过以下非常好的算法进行聚类:https://coviello.wordpress.com/2013/03/30/learning-functional-programming-a-k-means-implementation-in-groovy/

完成聚类后,我们的结果如下:

[[centroid]: [[x?1, x?2...x?m],[x?1,x?2...x?m]...[x?1,x?2...x?m]] [centroid2]: [[],[]...[]] 

其中每个x阵列(属于患者)值是随机分配的,具体取决于它所分配的群集。

我的问题是:有没有办法在Groovy中扩展Double类,以便它还具有PatientId属性?或者我应该以其他方式看待这个问题吗?

1 个答案:

答案 0 :(得分:5)

kocko是错误的,只要您的所有代码都在Groovy中,就可以使用实例metaClass,如下所示:

// a list of patients
def patients = [ 'a', 'b', 'c', 'd', 'e' ]

// A list of doubles
def doubles  = [ 5.0, 6.0, 2.0, 1.0, 9.0 ]

// for each double, set it's patient property to the parent at the same index
def decorated = [doubles, patients].transpose().collect { dbl, patient ->
    dbl.metaClass.patient = patient
    dbl
}

// sort it for fun, to prove it works
def sortedDecorated = decorated.sort(false)

// and print each out
sortedDecorated.each {
    println "$it ${it.patient}"
}

打印:

1.0 d
2.0 c
5.0 a
6.0 b
9.0 e

当然,如果你将双打列表传递给某些Java代码,那么kocko是正确的,因为Java不知道metaClass,所以只返回一个简单的未修饰双打列表