我目前正在使用参数类型为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
答案 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