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
相关产品推荐
相关产品推荐

