我在这里张贴了一些代码,可以正确解决发布者遇到的问题。OP希望删除重复项,并将某些特殊项放在列表的顶部。我TreeSet
在一个特殊的Comparable
类中使用,包装了Locale
他们正在使用的类,以实现他们想要的。
然后我开始思考......像你一样......我是通过返回消除重复0
从compareTo
方法,而不是通过返回true
从equals
实现作为一个需要做的正确指示在重复Set
(自定义一个的Set
)。
我不反对使用此技术,但我是否使用了可能被视为 未记录的功能 ?我是否可以安全地假设继续进行此类操作会继续有效?
似乎这在(粗体的)JavaDoc中有TreeSet
很好的记录:
注意,如果要正确实现接口,则由一个集合(无论是否提供显式比较器)维护的顺序
必须与equals一致Set
。(请参见Comparable
或Comparator
对于与equals一致的精确定义。)之所以如此,是因为Set
接口是根据equals
操作定义的,但是
TreeSet
实例使用其compareTo
(或compare)方法执行所有元素比较
,因此两个元素被视为相等从集合的角度来看,此方法是相等的。
集合的行为是明确定义的,即使其顺序与equals不一致也是如此; 它只是不能遵守Set
接口的一般约定。
这是唯一实现Comparable
但与不一致的(?)JDK类的示例equals()
:
Set<BigDecimal> decimals = new HashSet<BigDecimal>();
decimals.add(new BigDecimal("42"));
decimals.add(new BigDecimal("42.0"));
decimals.add(new BigDecimal("42.00"));
System.out.println(decimals);
decimals
在最后有三个值,因为42
,42.0
并且42.00
是不相等的,只要equals()
关注。但是,如果将其替换HashSet
为TreeSet
,则结果集仅包含一项(42
-刚好是第一个添加的项),因为使用进行比较时,它们都被认为是相等的BigDecimal.compareTo()
。
这表明在使用与不一致的类型时TreeSet
,这以“ 损坏 ” 的方式出现equals()
。它仍然可以正常工作,并且所有操作都定义明确-
只是不遵守Set
类的约定-如果两个类不是equal()
,则它们不会被视为重复。
我在这里发布了一些代码,正确地解决了海报上的一个问题。OP希望删除重复项,并将某些特殊项置于列表的顶部。我使用了一个和一个特殊的类,该类包装了他们正在使用的,以实现他们想要的。 然后我开始想。。。正如你所做的。。。我是通过从方法返回来消除重复,而不是通过从实现返回来消除重复,这是正确指示中的重复(根据的定义)所需要的。 我不反对使用这种技术,但我是否使用了可能被视为未记录的功能?我是否可以放心地认
JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"
如何比较两个javascript集?我尝试使用和但都返回false。 这两个集合是等价的,因为根据定义,集合没有顺序(至少通常没有)。我看了MDN上的集合的留档,没有发现任何有用的东西。有人知道怎么做吗?
Map和Set都叫做集合,但是他们也有所不同。Set常被用来检查对象中是否存在某个键名,Map集合常被用来获取已存的信息。 Set Set是有序列表,含有相互独立的非重复值。 创建Set 既然我们现在不知道Set长什么样,有什么价值,那么何不创建一个Set集合看看呢? 创建一个Set集合,你可以这样做: let set = new Set(); console.log(set);
我正在尝试为firestore中的社交媒体应用程序组织数据。为帖子创建一个新集合或将其放入用户的子集合更好吗? 深度应该是一样的,但是一种方式比另一种方式有什么优势吗? 创建新集合: 职位(集合) 用户(集合) 用户中的子集合: 用户(集合)
然而,域的其余部分是具有挑战性的,出于许多原因,我不想直接将其映射到DB表。 我尝试引入由Hibernate管理的中间bean,并从这些bean映射到我的域,当所有的关系都是从挑战到容易的部分时,这很好地工作。当Hibernate管理的“Easy”类引用映射在自定义Java代码中的“挑战性”类,而不是直接Hibernate管理时,这种方法就失败了。 这时我意识到,我找不到自定义Hibernate和