2017-03-19 13 views
2

ジェネリックスタックをJavaで作成するプログラミング割り当てがあり、newNode Tのディープコピーを作成する必要があります。メソッドを深くする方法がわかりません。私はディープコピーを出力します。これまでのところ、私はこれを持っています:ディープコピーJavaのジェネリック

public class Stack<T> 
{ 

    private T[] data; 
    private int top; 
    private int size; 
    public Stack() 
    { top = -1; 
     size = 100; 
     data = (T[])new Object[100]; 
    } 
    public Stack(int n) 
    { top = -1; 
     size = n; 
     data = (T[])new Object[n]; 
    } 
    public boolean push(T newNode) 
    { if(top == size-1) 
      return false; // ** overflow error ** 
     else 
     { top = top +1; 
      data[top] = newNode.deepCopy(); 
      return true; // push operation successful 
     } 
    } 
    public T pop() 
    { int topLocation; 
     if(top == -1) 
      return null; // ** underflow error ** 
     else 
     { topLocation = top; 
      top = top -1; 
      return data[topLocation]; 
     } 
    } 
    public void showAll() 
    { for(int i = top; i >= 0; i--) 
     System.out.println(data[i].toString()); 
    } 


} 

私はnewNodeのディープコピーを作ることができます。私はメソッドのインターフェースが必要だと確信していますが、私は失われてしまっています。

+0

はSOへようこそ。参照:http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java 'T'に関する追加情報はありますか? 'clonable'インターフェースを実装していますか? – c0der

+0

@ c0der: 'Cloneable'を実装するかどうかは関係ありません。 'Cloneable'は公的なクローニング方法を提供しません。それは別の目的を果たします。 – newacct

答えて

0

おそらく最も一般的な、まっすぐ前方のソリューションは、建設時のディープコピールーチンを提供するために使用してコードを尋ねるで構成されます:.cloneは()である複製可能なクラスタイプのために例えばので

public class Stack<T> { 
    ... 
    private final Function<T, T> elementCopier; 
    public Stack<T>(Function<T, T> elementCopier) { 
    // make sure thy are not passing you a null copier: 
    this.elementCopier = Objects.requiresNonNull(elementCopier); 
    ... 
    } 
    ... 
    public boolean push(T element) { 
    ... 
    data[top] = elementCopier.apply(element); 
    ... 
    } 
    ... 
} 

をタイプがclonningの必要がないと文字列のような一定の単純なオブジェクトは、ユーザーがとしてのアイデンティティラムダx -> xを示すだろう、その場合には、ある場合

Stack<MyElemClz> stack = new Stack<>(x -> x.clone()); 
// or: 
Stack<MyElemClz> stack = new Stack<>(MyElemClz::clone); 
... 
MyElemClaz elem = ...; 
... 
stack.push(elem); 

:deepCopy実際にユーザーコードは次のようになりますコピー機:

Stack<String> stack = new Stack<>(x -> x) 

ユーザーはクラスを使用すると、それを強制することができ、一定の場合でもコピーを作成することに主張する場合:

Stack<String> stack = new Stack<>(x -> new String(x)) 
// or 
Stack<String> stack = new Stack<>(String::new)