2016-10-28 5 views
0

私は最初の1年の大学の割り当ての質問をしています。私はそれについて正直になるつもりです。あなたのうちのいくつかが私の質問に投票する前に、物事を明確にしたいだけです。私は完全なコードを望んでいない、私はちょうどいくつかの助けたい。ディープコピーしてインスタンスを返すJava

質問は2つの部分に分かれています。最初の部分は、コンストラクタが2つのプロパティを持つNucleotideクラスを記述することです。 'a'または 'c'または 'g'または 't'のいずれかでなければならないbaseという単一の文字は、それ以外の場合は 'n'であり、縮退というブール値でなければなりません。

この部分のための私のコードはここにある:

class Nucleotide { 
    private char base; 
    private boolean degenerate; 

    public nucleotide(char base, boolean degenerate){ 
     if(base != ‘a’ || base != ‘c’ || base != ‘g’ || base != ’t’){ 
     this.base = ’n’; 
     } else { 
      this.base = base; 
     } 
     this.degenerate = degenerate; 
    } 
} 

質問の次の部分は、ヌクレオチドオブジェクトを使用して、新しい細菌クラスを作成すると言います。細菌の例は、ゲノム(ヌクレオチドの集合)および種(ストリング)からなる。

文字列とコレクションを受け取るコンストラクタを作成し、それらを使用して種とヌクレオチドのコレクションを初期化します( )。 この部分のための私のコードはここにある:

class Bacteria { 
    //private ArrayList<Nucleotide> genome; 
    private String species; 

    public Bacteria(String species, ArrayList<Nucleotide> genome) { 
    genome = new ArrayList<Nucleotide>(); 
    this.species = species; 
    } 

私の問題は深いコピーを実行し、細菌のインスタンスを返すインスタンスメソッドを書くために、私たちに求められ、次のステップから始まります。私は直列化および反射せずに深いコピーを実行するにはどうすればよい

public Bacteria binaryFission() {

。私はこれらのことについてほとんど知りません。

もう一度、私はポインタまたはbinaryFission()メソッドを完了するために行く方法の基本的なアイデアが必要です。 私はSOにあるいくつかの深いコピーの質問を行ってきましたが、私の質問には関係しないので、私は重複した質問をしているとは思わない。私は詳細を提供してもうれしいです。

+0

なぜあなたは '// private ArrayList ゲノム;をコメントアウトしましたか? – Bohemian

+0

新しいリストを作成します。nucleatideを繰り返し、それぞれのコピーを作成します。コピーを新しいリストに追加し、その新しいリストでコンストラクタを呼び出して新しいBacteriaインスタンスを作成します。文字列のコピーを作成する必要はありません。これは不変であり、インスタンス間で安全に共有できるためです。 –

+0

それはコードを複製するので、私は信じています。私はコンストラクタにもそのコードを持っています。コンストラクタのArrayListを取得することで、そこからリストを初期化できます。その部分の論理が間違っていますか? @Bohemian – Saad

答えて

1

これは、手動で

それを行う方法であります
public Bacteria binaryFission() { 
    String speciesClone = this.species; 
    ArrayList<Nucleotide> genomeClone = new ArrayList<Nucleotide>(); 
    //now iterate over the existing arraylist and clone each Nucleotide 
    for(int index = 0; index < this.genome.size(); index++) 
    { 
     genomeClone.add(new Nucleotide(
          genome.get(index).getBase(), //needs to be added to the Nucleotide class to retrieve the base variable 
          genome.get(index).getDegenerate() //needs to be added to be allowed to get its degenerate 
       )); 
    } 

    return new Bacteria(speciesClone, genomeClone); 
} 

FYI - Nucleotideクラスのプライベート変数のゲッターを追加する必要があります。これはプライベート変数であり、バクテリアはプライベート変数なしで値にアクセスできないためです。

+0

インデックス付きループを使用する代わりにforeachループを使用しないのはなぜですか?コードをもっときれいにするでしょう。 –

+0

私は常にインデックス付きループを使用します... –

+0

ええ、それはひどい考えです。リンクリストでは、より冗長で、エラーが発生しやすく、非常に非効率です。 –

1

Nucleotideにはセッターがなく、そのフィールドはプリミティブなので、実質的に変更できません(変更することはできないため、再利用することはできません)。フィールドfinalを正式に不変にすることをお勧めします。

深いコピーを作成するには、Nucleotideリストのシャローコピーを作成し、それを新しいBacteriaに使用するだけです。あなたはこのようにコピーを行うことができます。

List<Nucleotide> copy = new ArrayList<>(genome); 

あなたが自分自身の深いコピーを返しBacteria上の単純なファクトリメソッドを作成することができます。

public Bacteria copy() { 
    return new Bacteria(species, new ArrayList<>(genome)); 
} 
+0

投稿されたコードはコンパイルされず、クラスを使用可能にする方法がないので、実際には不変であるとは言い難いです。 –

+0

@JBN本当であるが、それが役に立たなかったら、その事実はOPによってすぐに発見され、彼はそれを修正するだろう。または、フィールドに直接アクセスできる内部クラスでも、ゲッターを省略することもできます。いずれにせよ、原始(最終)フィールドはここで重要なビットです。 – Bohemian

+0

私はあなたが非常に楽観的だと思います:-) –

関連する問題