Java中遍历两个对象参数生成所有组合实现多基因杂交庞尼特方格
多基因杂交庞尼特方格的Java实现方案
1. 重构Creature类,封装基因处理逻辑
不用反射,直接在Creature类里处理基因的拆分与存储,既符合面向对象的封装原则,也更易维护。
import java.util.Arrays; import java.util.List; public class Creature { private List<String> genes; // 构造函数:接收逗号分隔的基因字符串(如"B,b") public Creature(String geneStr) { // 分割字符串并转成List,自动忽略输入中可能存在的空格 this.genes = Arrays.asList(geneStr.split("\\s*,\\s*")); } // 获取拆分后的基因列表 public List<String> getGenes() { return genes; } }
2. 实现杂交组合逻辑
通过双重循环遍历两个Creature的基因列表,生成所有可能的基因组合,最后拼接成目标格式输出。
import java.util.Scanner; public class PunnettSquareGenerator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 获取用户输入的父代基因 System.out.print("请输入母代基因(格式如B,b):"); String momGeneStr = scanner.nextLine(); System.out.print("请输入父代基因(格式如C,c):"); String dadGeneStr = scanner.nextLine(); Creature mom = new Creature(momGeneStr); Creature dad = new Creature(dadGeneStr); // 生成所有基因组合 StringBuilder result = new StringBuilder(); for (String momGene : mom.getGenes()) { for (String dadGene : dad.getGenes()) { if (result.length() > 0) { result.append(", "); } result.append(momGene).append(dadGene); } } // 输出最终结果 System.out.println(result.toString()); scanner.close(); } }
3. 多基因扩展方案
如果后续需要支持多对基因(比如同时处理Bb和Cc两对,输入格式为"B,b,C,c"),可以新增基因对拆分逻辑,再生成笛卡尔积组合:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; // 新增辅助方法拆分基因对 private static List<List<String>> splitIntoGenePairs(List<String> genes) { List<List<String>> pairs = new ArrayList<>(); // 按顺序每两个基因组成一对 for (int i = 0; i < genes.size(); i += 2) { pairs.add(Arrays.asList(genes.get(i), genes.get(i+1))); } return pairs; }
之后通过嵌套循环(或递归)遍历所有基因对的组合,即可生成多基因杂交的庞尼特方格结果。
关于反射的说明
你的场景完全不需要反射——反射多用于动态访问未知类的字段,而Creature的核心数据是基因字符串,直接封装拆分和获取方法,比反射更简单、安全,也更符合面向对象的设计逻辑:类自身管理并暴露数据,而非外部通过反射强行读取。
内容的提问来源于stack exchange,提问作者este
相关产品推荐
相关产品推荐

