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

如何让自定义TreeMap子类Table的entrySet返回Set<Table.Entry>?

解决方案

要实现Table.entrySet()返回Set<Table.Entry>且不复制元素,核心是通过迭代器包装的方式,将原TreeMap返回的Map.Entry动态适配为Table.Entry,而非一次性复制所有元素。以下是具体实现步骤:

1. 定义内部Entry接口与包装类

先在Table类中定义继承自Map.Entry<String, Integer>的内部接口,同时实现一个轻量包装类,将原Map.Entry转换为Table.Entry类型:

public class Table extends TreeMap<String, Integer> {
    // 对外暴露的Entry接口,仅作为类型标记
    public interface Entry extends Map.Entry<String, Integer> {}

    // 私有静态包装类,委托原Map.Entry的所有操作
    private static class EntryWrapper implements Entry {
        private final Map.Entry<String, Integer> originalEntry;

        EntryWrapper(Map.Entry<String, Integer> originalEntry) {
            this.originalEntry = originalEntry;
        }

        @Override
        public String getKey() { return originalEntry.getKey(); }

        @Override
        public Integer getValue() { return originalEntry.getValue(); }

        @Override
        public Integer setValue(Integer value) { return originalEntry.setValue(value); }

        @Override
        public boolean equals(Object o) { return originalEntry.equals(o); }

        @Override
        public int hashCode() { return originalEntry.hashCode(); }
    }

2. 重写entrySet()方法,返回自定义Set实现

创建一个复用原TreeMap.entrySet()逻辑的自定义Set,仅在迭代时动态包装元素:

@Override
    public Set<Entry> entrySet() {
        return new EntrySet(super.entrySet());
    }

    // 自定义Set,复用原集合的核心逻辑,仅包装迭代器
    private class EntrySet extends AbstractSet<Entry> {
        private final Set<Map.Entry<String, Integer>> originalSet;

        EntrySet(Set<Map.Entry<String, Integer>> originalSet) {
            this.originalSet = originalSet;
        }

        @Override
        public Iterator<Entry> iterator() {
            return new Iterator<>() {
                private final Iterator<Map.Entry<String, Integer>> originalIterator = originalSet.iterator();

                @Override
                public boolean hasNext() { return originalIterator.hasNext(); }

                @Override
                public Entry next() { return new EntryWrapper(originalIterator.next()); }

                @Override
                public void remove() { originalIterator.remove(); }
            };
        }

        @Override
        public int size() { return originalSet.size(); }

        @Override
        public boolean contains(Object o) {
            if (o instanceof Entry) {
                return originalSet.contains(((EntryWrapper) o).originalEntry);
            }
            return originalSet.contains(o);
        }

        @Override
        public void clear() { originalSet.clear(); }
    }

    // 其他业务方法...
}

实现说明

  • 无额外性能开销:所有操作都直接委托给原TreeMap的entry,仅在迭代时做一层轻量包装,没有元素复制或集合重建的成本。
  • 完全隐藏继承关系:对外暴露的Set<Table.Entry>与底层TreeMap实现完全隔离,调用者无法通过返回值知晓Table的继承细节。
  • 行为一致性:自定义Set的size()、contains()、clear()等方法均复用原集合逻辑,保证与TreeMap的行为完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:51:11