You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何为自定义类获取闭区间子集?

如何获取自定义对象集合的闭区间子集

根据Java API的说明:

以下单行代码可统计字典中包含在"doorbell"和"pickle"之间(包括两者)的单词数量。
count = dictionary.subSet("doorbell", "pickle\0").size();

我们都清楚,对于String类型元素的集合,给上限值追加"\0"就能把subSet()的半开区间转为闭区间;如果是Integer类型的集合,直接给上限值+1就可以实现同样的效果。

但如果集合中的元素是自定义对象,subSet()默认返回的是半开区间,比如下面这个例子:

count = employee.subSet(obj1, obj6).size();

那这种情况下,有没有办法获取包含上限对象的闭区间子集呢?当然有,核心思路就是构造一个在排序逻辑中刚好比目标上限对象"大一点"的自定义对象,把它作为subSet()的第二个参数,这样就能包含原本的上限对象了。

具体实现要结合你的自定义对象所实现的Comparable接口逻辑来做:

  • 假设你的自定义对象Employee是按id字段排序的,那你可以创建一个新的Employee对象,将其id设为obj6.getId() + 1(其他字段可随意填充,因为排序仅依赖id),然后把这个新对象作为subSet的上限参数。
  • 如果排序规则涉及多个字段,就要构造一个在排序逻辑里刚好排在obj6之后的对象——确保所有比obj6大的对象都排在它后面,但它本身仅比obj6大一点点,这样subSet(obj1, 新对象)就会包含所有<=obj6的元素。

举个具体的例子,假设Employee的compareTo方法先比较姓名,再比较年龄:

// 构造一个刚好比obj6大的对象
Employee upperBound = new Employee(obj6.getName(), obj6.getAge() + 1);
// 此时subSet将包含从obj1到obj6的所有元素
int count = employee.subSet(obj1, upperBound).size();

要是你的排序规则里没办法构造这样的"下一个"对象(比如排序字段是无法递增的特定字符串),还有个备选方案:先获取半开区间的子集并统计数量,然后单独判断上限对象obj6是否存在于原集合中,如果存在就把统计结果加1。不过要注意,这种方法存在并发风险——如果集合在判断和计数之间被修改,结果可能会不准确。

内容的提问来源于stack exchange,提问作者WonderWoman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:55:30