java List<> 的问题
我对 java List 和 arrayList 不太熟悉..我只需要一些东西可以顺利地进行追加和排序。
我的算法很简单:
set a father string
add father to speciesList
mutate father to some new child
make this new child the future father
go to step 2
这里给出了 ga_
和 ga_struct
的定义
public class ga_struct {
public String gene;
public int fitness;
}
public class ga_{
public List<ga_struct> vector= new ArrayList<ga_struct>();
public void sortspecies()
{
Collections.sort(vector,new Comparator<ga_struct>() {
@Override
public int compare(ga_struct o1, ga_struct o2) {
int res;
if(o1.fitness<o2.fitness)
res=-1;
else if(o1.fitness>o2.fitness)
res=1;
else
res=0;
return res;
}
}
);
}
public ga_struct mutate(ga_struct parent)
{
Random r= new Random();
...... do some modification to the parent
return parent;
}
}
我一直在这样做
ga_ newSpecies = new ga_();
Random r= new Random(10);
ga_struct father= new ga_struct();
father.gene="123";
newSpecies.vector.add(father);
for (int i = 1; i < 10; i++) {
ga_struct ng = new ga_struct();
ng=newSpecies.mutate(father);
ng.fitness=i;
newSpecies.vector.add(ng);
father=ng;
System.out.println(newSpecies.vector.get(i).gene+" with fitness factor "+newSpecies.vector.get(i).fitness);
}
newSpecies.sortspecies();
System.out.println("\ncurrent population\n");
for (int i = 0; i < 10; i++) {
System.out.println(newSpecies.vector.get(i).gene+" with fitness factor "+newSpecies.vector.get(i).fitness);
}
mutator 函数只是改变 String(gene)
一次一个字符。我刚刚在第一个循环中从“父亲”那里突变了 9 个新物种。但是..我不知道为什么代码的输出给了我这个-
133 with fitness factor 1
433 with fitness factor 2
433 with fitness factor 3
443 with fitness factor 4
453 with fitness factor 5
553 with fitness factor 6
563 with fitness factor 7
563 with fitness factor 8
573 with fitness factor 9
current population
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
573 with fitness factor 9
第一个循环证明突变正在缓慢进行..而且我还在突变后立即添加了,那么为什么后来所有这些都被覆盖了按最新版本?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先,你的对象使用有点奇怪。
在 mutate 中,你似乎正在改变并返回父亲。
这意味着您的列表将包含对同一实例的多个引用。
澄清一下:
在您的主要内容中:
尝试更多类似这样的内容:
在您的主要内容中:
First off, your object usage is a bit weird.
In mutate, you seem to be changing and returning the father.
This means your list will contain multiple references to the same instance.
to clarify:
And in your main:
Try Something more like this:
and in your main:
您没有创建新对象,而是将父对象添加到向量中 9 次。
本质上你所拥有的是
父亲 -> obj@123
你的 List 对象看起来像这样
[ obj@123, obj@123, obj@123, ... ]
您将需要创建新实例来记录这一点。我建议实施“clone()”方法来执行此操作。
You're not creating a new object, you've added the father object 9 times to the vector.
Essentially what you've got is
father -> obj@123
What your List object looks like is
[ obj@123, obj@123, obj@123, ... ]
You're going to need to create new instances to record this. I would recommend implementing the "clone()" method to do this.
您到处都在使用单个对象,您永远不会向列表中添加新的 ga_struct 实例。您的
mutate()
方法似乎只是修改了parent
参数并返回它 - 它仍然是同一个对象,只是被修改了,这意味着它在任何地方都被修改了。您确实创建了一个新的 ga_struct 实例,但您立即通过设置对变异的父亲的引用来覆盖它(这仍然是同一个实例,只是修改了)
:这个循环似乎有效,因为您可以按照发生的顺序看到对
father
的修改。 但是,您实际上所做的只是一遍又一遍地将对同一(已修改)对象的引用添加到List
中。因此,当您最终将它们全部打印出来时,您会在
List
中看到 10 个重复条目。我的建议是更改
mutate()
以返回ga_struct
的新实例 - 您可以创建一个新对象并将其gene
字段设置为是来自parent
的突变gene
字段。或者您可以克隆
parent
和 then 更改克隆的基因字符串。无论哪种情况,您最终都会返回一个新的 ga_struct 实例,这应该可以解决问题。You're working with a single object everywhere, you never add a new
ga_struct
instance to the list. Yourmutate()
method appears to simply modify theparent
parameter and returns it - it's still the same object, just modified, which means it's modified everywhere.You do create a new instance of
ga_struct
but you immediately overwrite it by setting the reference to the mutatedfather
(which is still the same instance, just modified):Your output in this loop seems to work because you see the modifications to
father
in the order they happen. However, what you're actually doing is just adding references to the same (modified) object over and over into theList
.Thus, when you finally print them all out, you see 10 duplicate entries in the
List
.My suggestion is to change
mutate()
to return a new instance ofga_struct
- you could either create a new object and set it'sgene
field to be the mutatedgene
field fromparent
. Or you couldclone
parent
and then change the clone's gene string. In either case, you will end up returning a new instance ofga_struct
which should fix the problem.