所以我正在做第一年的大学任务问题,我会诚实地对待它。我只是想在你们有些人下来之前说清楚 - 投票我的问题。我不想要完整的代码,我只想要一些帮助。
这个问题分为两部分。第一部分是编写一个Nucleotide类,其构造函数有两个属性。一个叫做base的字符必须是' a'或者' c'或者' g'或者' t'否则它应该是' n'和一个名为degenerate的布尔值。
这部分的代码在这里:
where b = goo a
a = foo
问题的下一部分说使用Nucleotide对象并创建一个新的Bacteria类。细菌的实例由基因组(核苷酸的集合)和物种(String)组成。
您必须创建一个接受String和集合的构造函数,并使用它们 初始化物种和核苷酸的集合。 这部分的代码在这里:
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;
}
}
我的问题从下一步开始,它要求我们编写一个执行深层复制并返回Bacteria实例的实例方法。
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() {
方法的基本思路。 我已经阅读了几个关于SO的深层复制问题,但没有一个与我的问题相关,所以我不相信我会问一个重复的问题。我很乐意提供更多细节虽然。
答案 0 :(得分:1)
由于Nucleotide
没有setter,并且其字段是原始的,因此它实际上是不可变的(无法更改,因此可以安全地重用&#34;)。你最好让字段final
正式使其成为不可变的。
您需要制作一份深层副本,只需制作Nucleotide
列表的浅表副本,然后在新的Bacteria
中使用该副本。你可以制作这样的副本:
List<Nucleotide> copy = new ArrayList<>(genome);
您可以在Bacteria
上创建一个简单的工厂方法,返回自身的深层副本:
public Bacteria copy() {
return new Bacteria(species, new ArrayList<>(genome));
}
答案 1 :(得分: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);
}
仅供参考 - 你需要为你的Nucleotide类私有变量添加getter,因为它们是私有的,并且Bacteria在没有它们的情况下无法访问它们的值。