2016-10-16 5 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

編集:ArraySetは実際に設定のように振る舞うように更新しました...

は、ここでは、あなたを実装する方法の例ですequals(Set<T> s)方法。あなたの質問にすべてArraySetが含まれていないので、私はあなたのArraySetがどのように動作するのかを仮定しなければならず、それは参照型(ジェネリック)をサポートしています。

equal(Set<T> s)の方法は、単にアレイをループし、scontains(Object o)メソッドを使用します。最悪のシナリオでは、配列のすべてのn要素をループするので、これはO(n)です。これは、要素が含まれていないか、すべての要素がチェックされていることがわかるまで検査を続行します。 Setsize()と配列のlengthが等しくない場合、ループは開始しません。 ArraySetequals(Set<T> s)方法を使用しての

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; 
    } 

} 

例:

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やList、あるいはそれらのサブクラスの他の実装を使用することは許されていません。 –

+0

自分のバージョンのセットを実装していますか?少なくとも私にとって、質問は本当にあまり明確ではありません。メソッドの例を 'equals'とし、エラーが与えられたクラスは 'ArraySet'です。私の前提につながります。 –

+0

はい、この全体がSetのカスタム実装です。 –

関連する問題