Scala中的平等关系
我偶然发现了Tony Morris的一个
blog-posts about Java以及该语言的一个基本问题:为一个集合定义一个定制的平等关系.这是我认为是一个大问题,并想知道是否有一些scala解决方案.
经典问题表现在思考交易.假设我在150便士的情况下进行了100笔沃达丰股票交易.这两笔交易是平等的,是吗?除非他们不是同一笔交易.对于普通的真实世界系统,通过持久性或序列化,我不能依赖于身份来告诉我两个引用是否属于同一行业! 所以我想要的是能够创建一个我可以传递Equality-relation的集合: val as = CleverSet[Trade](IdEquality) val bs = CleverSet[Trade](EconomicsEquality) 如何以有效的方式实现我的集合(除非EqualityRelation还定义了一个哈希机制)? trait EqualityRelation[T] { def equal(t1: T,t2: T) : Boolean def hash(t: T) : Int } 所以问题是: >有没有提供这种能力的图书馆? 似乎带有implicits,添加到现有的scala Set类型将是一件非常容易的事情. 解决方法
这可以通过Java的TreeSet和Comparator实现来实现:
TreeSet<String> ignoreCase = new TreeSet<String>(new Comparator<String>(){ @Override public int compare(String o1,String o2) { return o1.compareToIgnoreCase(o2); }}); TreeSet<String> withCase = new TreeSet<String>(); List<String> values = asList("A","a"); ignoreCase.addAll(values); withCase.addAll(values); 输出: ignoreCase -> [A] withCase -> [A,a] 这样做的缺点是比较器要实现的功能比需要的更强大,并且您只能使用支持比较器的集合.正如oxbow_lakes所指出的,Comparator实现打破了Set契约(对于!a.equals(b)它可能是新的Set(); set.add(a)== true&& set.add(b)= = false). Scala通过A =>的视图转换支持这一点.有序[A]. scala> new scala.collection.immutable.TreeSet[String]()(x=> x.toLowerCase) + "a" + "A" res0: scala.collection.immutable.TreeSet[String] = Set(A) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |