2016-10-16 2 views
0

В настоящее время я работаю над назначением с рядом методов с параметрами типа 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

Вы пробовали 'set.toArray (T [] array)'? Это может сработать для вас, если вы не заботитесь о фактическом типе –

+0

. Проблема с этим - это Java, который не позволит мне создать общий массив. –

ответ

0

Edit: обновление, так что ArraySet фактически ведет себя как набор ...

Вот пример того, как можно реализовать ваше equals(Set<T> s) способ. Поскольку в ваш вопрос был включен не все ArraySet, я должен был предположить, как ваш ArraySet будет работать, и что он поддерживает любой ссылочный тип (generics).

Метод equal(Set<T> s), просто проходит через массив и использует метод contains(Object o) на s. Это O (n), поскольку в худшем случае вы выполняете цикл через все n элементов массива. Он будет продолжать проверку, пока не найдет, что он не содержит элемент или все элементы были проверены. Обратите внимание, что цикл не запускается, если size() из 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; 
    } 

} 

Пример использования ArraySet «s equals(Set<T> s) метод:

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

public class ArraySetTest { 

    public static void main(String[] args) { 

     Set<String> stringSet = new HashSet<>(); 
     stringSet.add("Foo1"); 
     stringSet.add("Foo2"); 

     ArraySet<String> arraySet = new ArraySet<>(); 
     arraySet.add("Foo1"); 
     arraySet.add("Foo2"); 

     System.out.println(arraySet.equals(stringSet)); 

    } 

} 
+0

Я не знаю, что такое тип Set, он общий. Мне не разрешено использовать какую-либо другую реализацию любого Set или List или любого из их подклассов. –

+0

Так вы реализуете свою собственную версию Set? Вопрос действительно не очень ясен, по крайней мере для меня. Вы поместили пример метода 'equals', а класс с заданной ошибкой - это' ArraySet', который приводит меня к моему предположению. –

+0

Да, все это обычная реализация набора. –

Смежные вопросы