我如何循环遍历java中两个不同对象的参数,以显示所述参数的所有可能组合?

k2fxgqgv  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(137)

我不是很擅长这个,但我正在尝试用Java创建一个程序,它可以从两个对象的参数中创建一个多杂交交叉Punnett正方形,这两个对象是父母。每个参数都是一个字符串,由用户使用扫描仪定义。
这是我拥有的两个对象,为了回答这个问题而进行了修改(它们实际上有七个字符串参数,这些参数是它的遗传特征,它们都是由用户使用scanner填写的)
生物妈妈=新生物(“B,b”);生物爸爸=新生物(“C,c”);
我想用一个for循环在控制台里得到结果" BC,bC,Bc,bc ".
我知道我需要在某个地方使用分隔符或拆分来得到这些结果,但我还没有真正做到这一点。
我已经创建了一个punnett正方形,它包含两个字符串数组,我循环遍历它们,如图所示,

//accept user input
   Scanner alleles = new Scanner(System.in);
      System.out.println("enter first allele in mother's allele pair: ");
      Mom.alleleOne = alleles.nextLine();
      System.out.println("enter second allele in mother's allele pair: ");
      Mom.alleleTwo = alleles.nextLine(); 
      System.out.println("enter first allele in father's allele pair: ");
      Dad.alleleOne = alleles.nextLine();
      System.out.println("enter second allele in father's allele pair: ");
      Dad.alleleTwo = alleles.nextLine();
   //close scanner
   alleles.close();
   //arrays for parents data
   String[] Mother = {Mom.alleleOne, Mom.alleleTwo};
   String[] Father = {Dad.alleleOne, Dad.alleleTwo};
   //display data
   System.out.println("Mother Result: " + Arrays.toString(Mother));
   System.out.println("Father Result: " + Arrays.toString(Father));
   System.out.println("Possible children: ");
   // for loop to cycle through combinations
   for (int i = 0; i < Mother.length; i++) {
      for (int j = 0; j < Father.length; j++) {
         System.out.println(Mother[i] + Father[j]);

      }
    }//end for

但是我真的认为继续使用对象是我继续这个项目的最好选择。我曾经考虑过使用反射,把一个对象转换成一个字段/参数数组,但是我的脑海中似乎没有任何东西。我希望我的要求是有意义的,如果没有,我道歉。提前感谢你。

up9lanfz

up9lanfz1#

但我真的认为继续使用对象是我继续这个项目的最好选择。
是的!创建一个costom类并为每个字段生成getter(如果需要)和一个返回所有字段值列表的getter。创建一个方法来计算笛卡尔积(这是你想要对值做什么的正确术语)。从用户那里获取逗号分隔的值并用数据填充你的对象。
附件是一个示例代码,作为一个起点,有三个字段。适应你的想法应该很容易。注意,没有太多的错误处理。你应该考虑如何做到这一点。

import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Example {
    public static void main(final String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter comma separated allele values for mother: ");
        String mom = input.nextLine();
        System.out.println("Enter comma separated allele values for father: ");
        String dad = input.nextLine();

        Creature momCreature = new Creature(mom);
        Creature dadCreature = new Creature(dad);

        System.out.println("Cartesian product of Alleles for the two creatures:");
        System.out.println(momCreature.cartesianProductOfAlleles(dadCreature));
    }

    static class Creature {
        String firstAllele;
        String secondAllele;
        String thirdAllele;

        public Creature(String alleles) {
            String[] data = alleles.split("\\s*,\\s*");
            if (data.length != 3) {
                throw new InputMismatchException(
                        "Expected 3 comma separated values for the input[" + alleles + "]. Actual : " + data.length);
            }
            firstAllele = data[0].trim();
            secondAllele = data[1].trim();
            thirdAllele = data[2].trim();
        }

        String getFirstAllele() {
            return firstAllele;
        }

        String getSecondAllele() {
            return secondAllele;
        }

        String getThirdAllele() {
            return thirdAllele;
        }

        List<String> getAllAlleles() {
            return List.of(firstAllele, secondAllele, thirdAllele);
        }

        String cartesianProductOfAlleles(Creature other) {
            return this.getAllAlleles()
                       .stream()
                       .map(str1 -> other.getAllAlleles()
                                         .stream()
                                         .map(str2 -> str1 + str2)
                                         .collect(Collectors.joining(", ")))
                       .collect(Collectors.joining(", "));
        }
    }
}

对于a,b,cx,y,z的样本输入,上述公式将产生:

ax, ay, az, bx, by, bz, cx, cy, cz

相关问题