Как я могу скопировать значения массива, а не ссылку в Java? - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь скопировать значения массива tempo в newPosition, но newPosition постоянно меняется, когда tempo изменяется методом getObjectPosition(). Вот мой код.

private int[] newPosition = new int[2];
private int[] oldPosition = new int[2];
private int[] tempo = new int[2];
private int  theId, objectSpeed
private boolean threadInitialized = false;

while(this.getObjectMagnitude() > 0)    {

        tempo = this.getObjectPosition();

        if(!this.notification)  {
            System.out.println("Hostile Object Identified! Tracking in progress.....");
            Arrays.fill(this.onOffSwitch,false);
            investigatePatterns.submit(analyseFutures);
            this.notification = true;
        }

        if(this.init_pos)   {

            this.newPosition = this.tempo.clone();
            this.newAndOldTime[1] = System.currentTimeMillis();
            this.init_pos = false;
        }
        else if(!this.init_pos) {

            System.out.println(this.newPosition[0]+"," +this.newPosition[1]+" and "+
                    this.tempo[0] + "," + this.tempo[1] 
                    );

            if(!(Arrays.equals(this.newPosition, this.getObjectPosition())))    {    //do other stuff }
        }
 }

Я также пробовал другие методы, такие как System.arraycopy() и реализацию цикла for, но ни один из них не работал.

А вот и метод getObjectPosition

private int[] getObjectPosition()   {
    return MainThread.theObject[this.theId].getPosition();
}

Что мне здесь не хватает?

EDIT Я сейчас использую этот цикл. Работает

    private static int[] fullCopy(int[] source) {
    int[] destination = new int[source.length];
    String e, f, g = "0";

    for(int i=0; i< source.length; i++) {
    f = Integer.toString(source[i]);    
    for(int k=0; k<f.length();k++)
    {
        for(int h=0; h<10; h++) {
        e = Integer.toString(h);
            if((f.charAt(k)) == (e.charAt(0)))
                g = g + (e.charAt(0));
        }
    }
    destination[i] =Integer.valueOf(g);
    g = "0";
    }
    return destination;
}

1 Ответ

0 голосов
/ 16 сентября 2018

Array.clone копирует ссылки на массив, поэтому любое изменение одного элемента в массиве приведет к изменению соответствующей ссылки на другой массив. То, что вы пытаетесь сделать, это скопировать значения массива. Для этого я бы порекомендовал создать цикл для прохождения каждого индекса в массиве A и присвоения ему того же индекса в массиве B.

Также как примечание для логических условий вам не нужно иметь

if(bool == true)

Вы можете вместо этого сделать

if(bool)

И для проверки ложного значения выполните

if(!bool)

Пример System.arraycopy:

void runExample(){                                                                           

//show before                                                                            
printArrays();                                                                           

//copy array values                                                                      
System.arraycopy(originalArray, 0, copiedArray, 0, originalArray.length);                

//show after copy                                                                        
printArrays();                                                                           

//change original values                                                                 
for (int i = 0; i < originalArray.length; i++){                                          
    originalArray[i] = i;                                                                
}                                                                                        

//show values after change                                                               
printArrays();

}
Результаты этого:

исходный массив: 4,2 скопированный массив: 0,0

исходный массив: 4,2 скопированный массив: 4,2

исходный массив: 0,1 скопированный массив: 4,2

...