Не работает несложный алгоритм

261
07 октября 2017, 18:42

Уважаемые товарищи, у меня просто ужас, а не ситуация. Не могу понять битый час в чём проблема, больше напоминает проблемы с софтом и/или компьютером. Собственно код с пояснениями:

public class NewClass {
  public static void crossover(double[] A, double[] B, double[] AB, double[] BA) {
    /*
     * Некий код "генетической" замены без уймы ненужного. 
     * Задача такая: выбираются две точки (индексы) pointA и pointB,
     * между которыми все значения из массива A идут в массив BA,
     * а значения B в AB.
     * В итоге значения A и B не должны меняться
     */
    int len = A.length;
    //Присваиваю некоторые такие значения, при которых начинается магия
    int pointA = 3; 
    int pointB = 5;
    boolean inOrOut = false;
    if ((pointB - pointA) >= ((len - pointB) + pointA - 1)) {
        inOrOut = true;
    }
    for (int i = 0; i < len; i++) {
        boolean iBetweenPoints = (i >= pointA && i <= pointB);
        if (!inOrOut && !iBetweenPoints) {
            /*
            Вот тут суть магии: 
            Начинают меняться значения массива A,
            Что я никак объяснить не могу;
            Более того при добавлении строк со **
            код перестаёт всячески выполнять предназначение
             */

            //double te = A[i];  **
            AB[i] = B[i];
            //A[i] = te;  **
            BA[i] = A[i];
        }
    }
  }
  public static void main(String[] args) {
    //Случайный пример
    double[] a = {0, 7, 2, 4, 9, 0, 1};
    double[] b = {1, 3, 9, 2, 0, 4, 0};
    double[] ab = a;
    double[] ba = b;
    crossover(a, b, ab, ba);
    for (int i = 0; i < ab.length; i++) {
        System.out.print(ab[i] + " ");
    }
    System.out.println();
    for (int i = 0; i < ab.length; i++) {
        System.out.print(ba[i] + " ");
    }
    /*
    На выходе: 
    1.0 3.0 9.0 4.0 9.0 0.0 0.0 
    1.0 3.0 9.0 2.0 0.0 4.0 0.0
    Надо:
    1.0 3.0 9.0 4.0 9.0 0.0 0.0 
    0.0 7.0 2.0 2.0 0.0 4.0 1.0
    */
  }
}
Answer 1

Вся суть вашей магии умещается в 4-х строчках:

double[] a;
double[] b;
double[] ab = a; //ab[] это не копия a[]!
double[] ba = b;

то есть действия которые в производите с ab[] идентичны действиям, которые вы производите с a[] (аналогично и с ba[] и b[])

Answer 2
double[] ab = a;
double[] ba = b;

Мне кажется что Вы подразумеваете, что здесь будут созданы новые массивы. А на самом деле это указатели на те же самые массивы.

READ ALSO
Как выполнять код Java в редакторе Atom?

Как выполнять код Java в редакторе Atom?

Скачал package "Script" для Atom, но при запуске Java кода в консоли выдает это: https://prntsc/gtyl2i Подскажите, как исправить?

296
Java - Как перенести значения от 1 до 8 с массива A в массив С через массив B?

Java - Как перенести значения от 1 до 8 с массива A в массив С через массив B?

Как правильно перенести значения от 1 до 8 с массива A в массив С через массив B? Переносить по одному значению так, чтобы минимальное значение...

166
junrar не распакавывает файлы

junrar не распакавывает файлы

Есть архив с 14 картинками, для распаковки использую:

266