gpt4 book ai didi

java - BinaryRelation接口(interface)

转载 作者:行者123 更新时间:2023-11-29 08:53:01 25 4
gpt4 key购买 nike

我想为二进制关系和传递关系定义优雅的接口。我将二进制关系视为一组对,是一组X×Y的子集。实际上,我打算主要使用传递关系,但有时我需要通用的二进制关系。这主要是供我自己使用,但最终我可能会将其作为FLOSS库发布给其他用户。我希望我的定义在总体上有意义,因为我对这些类的使用还没有确切的要求:我需要它们来从事与科学研究相关的实验工作,我现在有一些想法,但尚不清楚哪种类型随着研究过程中出现更多的想法,我将需要进行大量实验。

大概的概念

我(想我)需要的核心如下。

/**
* @param <F>
* the type used for the “from” elements.
* @param <T>
* the type used for the “to” elements.
*
*/
public interface BinaryRelationTentative<F, T> {
/**
* @return a view of the domain of this relation: all the elements x such that for some y, (x, y) is in the
* relation.
*/
public Set<F> getFromSet();

/**
* @return a view of the range of this relation: all the elements y such that for some x, (x, y) is in the relation.
*/
public Set<T> getToSet();

/**
* @return the number of pairs that this relation contains.
*/
public int size();

/**
* @return <code>true</code> iff the relation has empty from and to sets.
*/
public boolean isEmpty();

/**
* A binary relation equals an other one iff they have equal from and to sets and for each (x, y) contained in one,
* (x, y) is contained in the other one.
*/
@Override
public boolean equals(Object obj);

/**
* @return whether the given <code>from</code> element is in relation with the <code>to</code> element.
*/
public boolean contains(F from, T to);

/**
* Optional operation.
*/
public boolean add(F from, T to);
}


(这只是核心功能,所以您明白我的意思了。欢迎使用更好的遍历功能,等等,请参见下文。)然后,我将定义扩展 TransitiveRelation<E>BinaryRelation<E, E>,该实现不实现< cc>,而是提供 add

重用古典收藏

当然,现在,我想尽可能地重用经典的集合接口。番石榴的 addTransitive(F from, T to)javadocuser guide)似乎具有我需要的核心功能以及更多其他功能。用户指南甚至提到了未标记的有向图的用例。我直接使用 SetMultimap看到的一个问题是该术语并不完全正确:在二元关系的情况下谈论“键”和“值”是很奇怪的。而且,它错过了一些东西。在SetMultimap(设计为从键到值)中存在一种不对称性,而在二进制关系中则不那么有意义。 SetMultimap具有一个接口(和实现),该接口允许一个给定“ from”元素的人,通过与其相关的“ to”元素,有效地进行迭代(即,无需遍历整个关系)。同样,我希望能够有一个“ to”元素,有效地迭代相应的“ from”元素。因此,我需要一种可以称为BiSetMultimap的东西(对应于 SetMultimapMap<K, Set<V>>)。我在Java世界中找不到这种东西。

因此,我目前正在考虑将 Map<V, Set<K>>定义为 BinaryRelation<F, T>facade。然后,我可以在接口中创建命名更好的方法(概念上等同于 SetMultimap<F, T>中的方法),并且可以添加给出“ from”元素的方法 SetMultimap。我可以基于两个同步的 getInverselyRelated(T to): Set<F>提供实现,一个代表关系,另一个代表逆关系。

有很多解决此问题的方法。例如,我可以将 SetMultimap定义为扩展 BinaryRelation。或者,我可以避免完全隐藏 SetMultimap并通过 SetMultimap提供对其的访问。这样,我就获得了它们所有不错的方法接口。或者,我可以完全放弃使用特定接口的想法,而使用 BinaryRelation#asSetMultimap()代替 SetMultimap,然后考虑将反向遍历操作作为优化功能提供给特定类,但不能在接口级别使用。或者我可以使用SetMultimap以外的其他东西作为设计的基础。

因此,我的问题(终于!):您如何看待我的方法?您能考虑其他方法吗?我忽略了一些问题?我可以使用现有的解决方案?

可能的链接

我曾考虑过使用某些图形库( JUNGJGraphTBlueprint),但我认为它们不符合我的需求。所有这些都有一个 BinaryRelation类(或Edge类型参数),该类增加了复杂性,而在我看来,没有一个提供与 Edge一样好的接口和实现。如 Grph所述, user manual不提供顶点对象。我可能已经错过了一些东西,所以请告诉我您是否不同意。

(编辑。)正如Xaerxess所提到的,此番石榴 issue建议将我称之为BiSetMultimap的内容添加到番石榴。

最佳答案

听起来像是早期的优化:为什么不在内部使用两个数据结构(如问题所述,一个Map<K, Set<V>>Map<V, Set<K>>)。当使用最直接的方法遇到实际问题时,可以考虑使用晦涩难懂的库或Guava,但是与此同时,您可以在工作的其他方面取得进步。毕竟,接口的主要目的是隐藏底层实现,因此您以后可以更改它...

关于java - BinaryRelation接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21754560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com