将通用集转换为通用数组

时间:2016-10-16 21:21:24

标签: java arrays generics

我目前正在使用参数类型为Set的多种方法进行赋值。为了在我的程序中使用这些参数,必须将它们转换为数组,并且转换必须以不大于O(N)的时间复杂度完成。我很难过,因为我不知道该套装的类型,或任何关于它的属性。我可以得到这个集合的大小,但那是关于它的。我不允许使用ArrayList或任何其他List或Set类。 toArray()不起作用,编译器说它无法找到符号。我显然无法创建泛型类型数组。我现在该怎么办?

这是代码的示例。还有6种方法与标题类似。

   public boolean equals(Set<T> s) {
  T[] sArray = s.toArray(new T[s.size()]);

我的错误消息如下:

ArraySet.java:241: error: generic array creation
  T[] sArray = s.toArray(new T[s.size()]);
                         ^
ArraySet.java:241: error: cannot find symbol
      T[] sArray = s.toArray(new T[s.size()]);
                    ^
  symbol:   method toArray(T[])
  location: variable s of type Set<T>
  where T is a type-variable:
    T extends Comparable<? super T> declared in class ArraySet

1 个答案:

答案 0 :(得分:0)

编辑:已更新,以便ArraySet实际上表现得像Set ...

以下是如何实施equals(Set<T> s)方法的示例。由于并非所有ArraySet都包含在您的问题中,因此我必须假设您的ArraySet将如何运作,并且它支持任何引用类型(泛型)。

equal(Set<T> s)方法只是遍历数组并使用contains(Object o)上的s方法。这是O(n),因为最坏的情况你循环遍历数组的所有n元素。它将继续检查,直到它发现它不包含元素或已检查所有元素。请注意,如果size()的{​​{1}}和数组的Set不相等,则循环不会启动。

length

使用import java.util.Set; public class ArraySet<T> { private T[] array; private int count; private final int DEFAULT_CAPACITY = 16; public ArraySet() { array = (T[]) new Object[DEFAULT_CAPACITY]; count = 0; } public void add(T e) { if (count < array.length && !contains(e)) { array[count++] = e; } } public boolean contains(T e) { boolean hasElement = false; int i = 0; while (!hasElement && i < count) { hasElement = array[i++].equals(e); } return hasElement; } public boolean equals(Set<T> s) { boolean isEqual = s.size() == count; int i = 0; while (isEqual && i < count) { isEqual = s.contains(array[i++]); } return isEqual; } } 的{​​{1}}方法的示例:

ArraySet