如何对两个整数数组进行“交叉” - java

我正在尝试学习遗传算法,目前正在研究“交叉”两个“基因”。
基因是一个整数数组,由一和零组成。为了说明我的问题,假设我们有两个基因。

int[] geneA = {1,0,0,0,0};
int[] geneB = {0,1,1,1,0};

跨界(例如在位置3)的预期结果将是:

geneA = [1,0,0,1,0]
geneB = [0,1,1,0,0]

意味着索引为3或更高的每个元素都将与另一个基因的等效元素交换。为此,我编写了以下方法:

private void crossOver(int[] geneA, int[] geneB, int pos) {
    int copyA[];
    int copyB[];
    copyA = geneA;
    copyB = geneB;
    for(int i = pos; i < geneA.length; i++) {
        geneA[i] = copyB[i];
        geneB[i] = copyA[i];
    }
    System.out.println(Arrays.toString(geneA);
    System.out.println(Arrays.toString(geneB);
}

但是,似乎geneB的元素只是简单地以3或更高的索引复制到geneA中。
控制台输出如下:

[1, 0, 0, 1, 0]
[0, 1, 1, 1, 0]

任何解释或帮助都将受到高度赞赏。提前致谢!

参考方案

copyA = geneA不会创建副本。现在,两个变量都引用相同的数组。

无需在复制整个阵列上浪费时间和空间。

交换值时,只需将值之一存储在一个临时变量中。

private static void crossOver(int[] geneA, int[] geneB, int pos) {
    for (int i = pos; i < geneA.length; i++) {
        int temp = geneA[i];
        geneA[i] = geneB[i];
        geneB[i] = temp;
    }
}

这将就地更新数组,因此调用方将看到更改。

int[] geneA = {1,0,0,0,0};
int[] geneB = {0,1,1,1,0};
crossOver(geneA, geneB, 3);
System.out.println(Arrays.toString(geneA));
System.out.println(Arrays.toString(geneB));

输出量

[1, 0, 0, 1, 0]
[0, 1, 1, 0, 0]

Java-固定大小的列表与指定初始容量的列表之间的差异 - java

我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

从方法返回数组-Java - java

private static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…

JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java

我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …