跟踪返回了哪些 HashMap 值

Tracking which HashMap values have been returned

我有一个很大的 HashMap<Integer, MyObject> 位于服务器上。我需要通过网络将 StringMyObject 发送到客户端。我的问题是我想不出一个好的方法来跟踪 MyObject 已经被访问以发送 String

我希望客户端可以重复调用服务器的函数来检索 String,然后客户端可以将所有 String 添加到一个 ArrayList。服务器将通过返回 null.

来指示所有 String 已发送

我不能简单地发送所有 String 中的 ArrayList<String>,因为由于使用 RSA 加密,我只能发送很小的邮件。

到目前为止我想到的唯一方法是保留一个静态实例变量 HashSet<Integer> 来保存所有已访问的 MyObject。但这意味着我必须在每次查找时将 HashMap 交叉引用到 HashSet。一定有更好的办法。

这可能是一个 Map 的小例子,它跟踪确实被访问过的键。基本上,它只是覆盖了 HashMapget 方法,并且将确实访问过的 Key 添加到 Set

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class TrackMap<K, V>  extends HashMap<K,V>{
    private static final long serialVersionUID = 1L;

    Set<Object> usedKeys = new HashSet<>();

    @Override
    public V get(Object key) {
        usedKeys.add(key);
        return super.get(key);
    }

    public Set<Object> getUsedKeys() {
        return usedKeys;
    }

    public static void main(String[] args) {
        TrackMap<Integer, String> test = new TrackMap<>();
        for(int i = 0;i<100;++i) {
            test.put(i, Integer.toString(i));
        }
        System.out.println(test.get(5));
        System.out.println(test.get(10));
        System.out.println(test.get(15));
        System.out.println(test.get(17));
        System.out.println(test.get("what?"));

        for(Object i : test.getUsedKeys()) {
            System.out.println("The key " + i + " was accessed");
        }
    }
}

您可能想研究使用迭代器来访问 HashMap 的数据

迭代器将无重复地遍历映射中的每个对象,并且您不需要使用集合来跟踪您已经访问过的对象

Iterate through a HashMap