Gå til innhold

Anbefalte innlegg

Hei,

 

Lurte på en enkel ting med arrays.

MyObject[] dings = {1, 3, 5, 7, 11, 13};

Går det an? Eller må man gjøre sånn her?

MyObject[] dings = new MyObject[];
MyObject = {1, 3, 5, 7, 11, 13};

Eller...

MyObject[] dings = new MyObject[] {1, 3, 5, 7, 11, 13};

Og så en ting til. Hvis jeg skal kopiere et array, går dette da an?

MyObject[] dings = new MyObject[] {1, 3, 5, 7, 11, 13}; // eller hvordan man kan gjøre det...
MyObject[] boms = dings;

Vil dette funke? Og vil boms da få array-verdier som er lagret på sitt eget sted i minnet som har samme verdi som de i dings, eller vil de være kopier, slik at når man forandrer på dings[3], vil også boms[3] forandres?

 

Takk! :thumbup:

Lenke til kommentar
Videoannonse
Annonse

Emnetittelen i denne tråden er ikke god nok, om ikke dette blir endret slik at det er lettere å forstå hva slags informasjon tråden omhandler vil denne bli stengt! En god emnetittel er en tittel som forklarer godt hva innholdet i posten din går ut på. En bruker bør kunne skaffe seg oversikt over hovedinnholdet i posten bare ut fra å lese tittelen. Vennligst forsøk å ha dette i tankene neste gang du starter en tråd, og orienter deg om hva vår nettikette sier om dårlig bruk av emnetitler.

 

Bruk p_edit.gif-knappen i første post for å endre emnetittelen.

 

(Dette innlegget vil bli fjernet ved endring av emnetittel. Vennligst ikke kommenter dette innlegget, men rapporter gjerne dette innlegget når tittelen er endret, så vil det bli fjernet.)

Lenke til kommentar
Hei,

 

Lurte på en enkel ting med arrays.

MyObject[] dings = {1, 3, 5, 7, 11, 13};

Går det an?

 

Både ja og nei. Nei fordi du sier at du skal lage en array av MyObject, men det du gir arrayet er er primitiv datatype integer.

 

Men du kan skrive

int[] dings = {1, 3, 5, 7, 11, 13};

Det du gjør her er at du både deklarerer og initialiserer en array av int i en setning og det er lov.

 

Eller må man gjøre sånn her?

MyObject[] dings = new MyObject[];
MyObject = {1, 3, 5, 7, 11, 13};

På samme måte, se over. Det du gjør her er at du først deklarerer en array av (ikke myObject) integers og så initialiserer du den etterpå. Men skal du opprette en array uten å initialisere den må du fortelle hvor stor den skal være.

 

int[] dings = new int[6];

 

Eller...

MyObject[] dings = new MyObject[] {1, 3, 5, 7, 11, 13};

Syntaktisk feil

 

Og så en ting til. Hvis jeg skal kopiere et array, går dette da an?

int[] dings = {1, 3, 5, 7, 11, 13}; // eller hvordan man kan gjøre det...
int[] boms = dings;

Vil dette funke? Og vil boms da få array-verdier som er lagret på sitt eget sted i minnet som har samme verdi som de i dings, eller vil de være kopier, slik at når man forandrer på dings[3], vil også boms[3] forandres?

 

Jeg endret litt på koden din. Boms og dings er nå to ulike objekter og selv om du forandrer dings[3] vil boms[3] være uavhengig av den. Hvis du derimot deklarerer dings som static vil dings[3] og boms[3] være lik.

Lenke til kommentar
Eller...

MyObject[] dings = new MyObject[] {1, 3, 5, 7, 11, 13};

Syntaktisk feil

 

8074018[/snapback]

Nei, det er en semantisk feil (samme grunn som du nevnte ovenfor, integer kan ikke vaere MyObject). Derimot kan du skrive foelgende:

int[] dings = new int[]{1,3,5,7,11,13};
int[] dongs;
dongs = new int[]{2,4,6};

Foelgende gir kompileringsfeil:

int[] dongs;
dongs = {2,4,6};

Endret av Patton
Lenke til kommentar
Og så en ting til. Hvis jeg skal kopiere et array, går dette da an?

int[] dings = {1, 3, 5, 7, 11, 13}; // eller hvordan man kan gjøre det...
int[] boms = dings;

Vil dette funke? Og vil boms da få array-verdier som er lagret på sitt eget sted i minnet som har samme verdi som de i dings, eller vil de være kopier, slik at når man forandrer på dings[3], vil også boms[3] forandres?

 

Jeg endret litt på koden din. Boms og dings er nå to ulike objekter og selv om du forandrer dings[3] vil boms[3] være uavhengig av den. Hvis du derimot deklarerer dings som static vil dings[3] og boms[3] være lik.

8074018[/snapback]

Det er feil. dings og boms refererer til samme objekt. Forander du dings[3] forandrer du ogsaa boms[3]. int[] er nemlig et objekt, og maa ikke forveksles med den primitive type int. Aa deklarere det som static har ingenting aa si.

 

Kopiering av array (og objekter) er litt tricky. La oss ta et eksempel:

 

int[] dings = {2,4,6};
int[] boms = new int[3];
// Kopierer dings,start posisjon 0, til dongs,start posisjon 0, lengde = 3
System.arraycopy(dings,0,boms,0,3); // boms er naa uavhengig av dings

boms[2] = 8; // dings er uforandret

Point[] pointers = new Point[] {new Point(2,0), new Point(4,0), new Point(6,0)};
Point[] copyPointers = new Point[3];
System.arraycopy(pointers,0,copyPointers,0,3); 

copyPointers[2] = new Point(8,0); // pointers[2] og copyPointers[2] 
// peker naa til to forskjellige objekter, 
// pointers[2].x er lik 6, mens copyPointer[2].x er lik 8

copyPointers[1].x = 1; // Obs! Forandrer baade pointers[1] og 
// copyPointers[1]. copyPointers er nemlig en shallow copy 
// av pointers, dvs. bare array-objektet selv
// er kopiert (kopi = nye objekter), ikke innholdet

Endret av Patton
Lenke til kommentar
Det er feil. dings og boms refererer til samme objekt. Forander du dings[3] forandrer du ogsaa boms[3]. int[] er nemlig et objekt, og maa ikke forveksles med den primitive type int. Aa deklarere det som static har ingenting aa si.

 

 

8074405[/snapback]

 

Jeg måtte bare teste ut det du sa, og det viser seg at du har rett. Hvordan kopierer man objekter da?

Lenke til kommentar

Det finnes ingen standard metode hvordan man kan kopiere alle objekter. Det er avhengig av objekt til objekt. Slik kopierer man Point:

Point punkt = new Point(4,3);
Point kopi = new Point(punkt);

En Point-array er litt verre. Da maa man foerst spoerre seg, vil man en shallow-copy eller en deep-copy? En shallow copy lager et nytt array objekt, men bruker de samme objekt-referensene inni arrayet, og da kan man bruke System.arraycopy. En deep-copy kopierer alt, og det maa man som oftest implementere selv:

Point[] pointArray = new Point[]{new Point(1,0), new Point(2,0)};
Point[] deepCopy = new Point[pointArray.length];
for(int i = 0; i < pointArray.length; ++i) {
   deepCopy[i] = new Point(pointArray[i]);
}

Klassen Object har en protected metode clone, som returnerer Object. Meningen er at man skal override denne metoden i egne subklasser hvis man vil lage kloner/kopier, men det blir heller sjeldent gjort pga. betingelsene som stilles klassen som implementerer clone.

 

Man kan selvsagt serialisere og deserialisere objekter, da faar man en deep copy i de fleste tilfeller, bortsett fra variabler som er transient, og klasser som ikke implementerer Serializable.

Lenke til kommentar
Unødvendig quoting samt dårlig bruk av emnefeltet blir sett på som upasselig, og kan bli sensurert eller endret av moderatorer. Overdreven bruk av såkalt SMS-språk, utropstegn/spørsmålstegn, forkortelser osv. skal unngås. Emnefeltet skal beskrive innholdet i tråden. Eksempel: Problem med TV-ut på Radeon 9800. Dårlig bruk av emnefelt medfører stengning av tråden.
Et bra emnefelt er et emnefelt som forklarer godt hva innholdet i posten din går ut på. En bruker bør kunne skaffe seg oversikt over hovedinnholdet i posten bare ut fra å lese emnefeltet.

Tråden har et dårlig emnefelt og vil bli stengt deretter. Vennligst les utdraget over fra retningslinjene og netiketten angående dette.

Lenke til kommentar
Gjest
Dette emnet er stengt for flere svar.
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...