【问题标题】:How to extend the java HashSet class with a new function?如何使用新函数扩展 java HashSet 类?
【发布时间】: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 扩展函数的一个很好的用例

标签: java android hashset


【解决方案1】:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;

public class RandomHashSet<E> extends HashSet<E> {
    private Random mRand = new Random();

    public E randomElement() {
        if (size() == 0) {
            return null;
        }
        int index = mRand.nextInt(size());
        Iterator<E> iter = iterator();
        for (int i = 0; i < index; i++) {
            iter.next();
        }
        return iter.next();
    }
}

【讨论】:

  • 谢谢,看来效果不错!但是,其他 cmets 建议我根本不应该扩展 HashSet,而是实现一个静态方法。所以我正在重新考虑它......
  • 我认为扩展 HashSet 没有任何问题。这仅取决于您如何使用您的课程; Set set1 = new RandomHashSet();您只使用了 Set 中的方法;或 HashSet set2 = new RandomHashSet();这是经典的 HashSet;或者作为我们的 new RandomHashSet set3 = new RandomHashSet();
  • 这是一种更好的方法,然后将 HashSet 包装在另一个具有“HAS A”HashSet 的类中,因为您可以将此类传递给需要 HashSet 的其他类。顺便说一句,randomElement() 函数是 O(n) 时间,而如果有一个数组 O(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多