gpt4 book ai didi

java - 查找 ArrayList 中最常见的随机分配的字符串

转载 作者:行者123 更新时间:2023-12-02 01:05:35 24 4
gpt4 key购买 nike

我正在开发一个模拟器,其中 Person 对象(存储在 ArrayList 中)“繁殖”并生成婴儿,并且它们继承“基因”,表示为 4 个字母的字符串。在程序开始时,第一个人的基因库是随机生成的。

在计时器的每一个滴答声中,我想计算所有 Person 对象中最常见的“基因”是什么。

这四个字母是:
1.G、Z、N、F
2.A、T、C、G
3. B、F、Q、N
4.A、C、T、E

在这种情况下有 256 种可能的组合,并且必须有比 256 个 if-else 语句更有效的检查。

Person 类(减去 get/set 方法)

public class Person {
static Random rand = new Random();
private Person mother;
private Person father;
private String genes;
private char sex;
private int age, numKids;

public Person() {
mother = null;
father = null;
genes = createGenes();
if (rand.nextDouble() <= 0.5)
sex = 'm';
else
sex = 'f';
age = 18;
numKids = 0;
}

public Person(Person m, Person f) {
mother = m;
father = f;
genes = inheritGenes(m, f);
if (rand.nextDouble() <= 0.5)
sex = 'm';
else
sex = 'f';
age = 0;
}
//create genes for original Persons
private String createGenes() {
String genetics = "";

double first = rand.nextDouble();
double second = rand.nextDouble();
double third = rand.nextDouble();
double fourth = rand.nextDouble();

if (first <= 0.25)
genetics += "G";
else if (first <= 0.68)
genetics += "Z";
else if (first <= 0.9)
genetics += "N";
else
genetics += "F";

if (second <= 0.65)
genetics += "A";
else if (second <= 0.79)
genetics += "T";
else if (second <= 0.85)
genetics += "C";
else
genetics += "G";

if (third <= 0.64)
genetics += "B";
else if (third <= 0.95)
genetics += "F";
else if (third <= 0.98)
genetics += "Q";
else
genetics += "N";

if (fourth <= 0.37)
genetics += "A";
else if (fourth <= 0.58)
genetics += "C";
else if (fourth <= 0.63)
genetics += "T";
else
genetics += "E";
return genetics;

}
//inherit genes from parents for new Persons
public String inheritGenes(Person m, Person f) {
String genetics = "";
double first = rand.nextDouble();
double second = rand.nextDouble();
double third = rand.nextDouble();
double fourth = rand.nextDouble();

if (first < 0.5) {
genetics += m.getGenes().charAt(0);
} else
genetics += f.getGenes().charAt(0);

if (second < 0.5) {
genetics += m.getGenes().charAt(1);
} else
genetics += f.getGenes().charAt(1);

if (third < 0.5) {
genetics += m.getGenes().charAt(2);
} else
genetics += f.getGenes().charAt(2);

if (fourth < 0.5) {
genetics += m.getGenes().charAt(3);
} else
genetics += f.getGenes().charAt(3);

return genetics;
}
}

最佳答案

List<Person> 中查找最常见基因的示例代码。我刚刚为 genes 添加了一个 getter String :

String getGenes() {
return genes;
}

代码如下:

List<Person> people = new ArrayList<>();

for (int i = 0; i < 100; i++) {
people.add(new Person()); // 100 random genes
}

String mostCommonGene = people.stream()
.map(Person::getGenes)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.max(Comparator.comparingLong(Map.Entry::getValue))
.get()
.getKey();

System.out.println("Most common gene: " + mostCommonGene);

我们使用 Java 8 Streams:

  • 我们得到stream()people列表。
  • 我们map() (变换)每个PersonString - 他们的genes .
  • 我们collect() groupingBy()基因流Function.identity() 提供和Collectors.counting() 。此步骤生成 Map<String, Long>它代表 genes map 以及它们的频率。实际上,这计算了 people 中基因的出现次数。列表。
  • 然后我们调用entrySet()在那张 map 上,然后stream()再次 - 现在我们有一个映射条目(您可以将它们视为成对 - 一个对象内的基因及其频率。方便)。
  • 我们调用max()查找具有最高(解释为频率)的条目Comparator.comparingLong()告诉max()算法如何比较这些对,但不是 - 这就是为什么我们必须告诉它如何将条目转换为long - 我们得到该条目的
  • 然后我们调用get() ,自 max()返回 Optional<T> 。我们只想要T (条目)。
  • 最后,我们调用getKey()在代表一对最常见基因及其频率的条目上。如前所述,键是基因,值是其频率。
<小时/>

如果您不熟悉本答案中描述的大多数概念,我强烈建议您学习Java 8 Streams。一旦你习惯了它们,你就停不下来。

关于java - 查找 ArrayList 中最常见的随机分配的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57733511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com