【发布时间】:2018-06-24 21:28:56
【问题描述】:
我正在制作一个安卓应用程序。我想扩展 HashSet 类并向它添加一个新函数,该函数从集合中选择一个随机元素。其他一切都应该像普通的 HashSet 一样。
所以我想到了这门课:
public class RandomHashSet<E> extends HashSet<E> {
private Random mRand = new Random();
}
我想添加一个在 HashSet 上执行此代码的函数:
if (set.size() == 0) {
return null;
}
int index = mRand.nextInt(set.size());
Iterator<Object> iter = set.iterator();
for (int i = 0; i < index; i++) {
iter.next();
}
return iter.next();
但是,我不确定如何在类中实现这个函数,特别是如何调用实例化的集合以及如何对其进行迭代。
在HashSet source code 我看到他们初始化了一个名为'map'的变量:
map = new HashMap<>();
例如HashSet add()函数是这样实现的:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
我也可以在我的函数中以某种方式使用“地图”吗(私有)?
【问题讨论】:
-
地图字段是私有的,因此您无权访问它
-
您可以访问 sets iterator 和 size 方法,因此扩展
HashSet并添加此方法应该很简单,只需删除set. -
不要扩展 HashSet,因为这意味着您只能在该特定类上调用此方法。您可以创建一个方法(可能是静态的),它只接受任何集合并返回一个随机元素;它不必“烘焙”到实例中。
-
同意 Andy,因为此实现适用于任何
Collection。 -
我知道这是 Java,但是 Kotlin 扩展函数的一个很好的用例