Gå til innhold

Hvordan hente et array inn i en metode via parametre?


Anbefalte innlegg

Hei! :)

 

Jeg prøver å lage en metode som kopierer multi-dim-arrays eller tabeller, og tror jeg begynner å nærme meg, men får ikke til å "hente" inn arrayet i metoden. Hadde jo vært lett om det var en streng, men array blir straks verre.

Slik er koden foreløpig:

class Matrix {

 public static void copy(String args[]) {
String[][] copyFrom = args[0];						 //(1)
int startFromX = Integer.parseInt(args[1]);
int startFromY = Integer.parseInt(args[2]);
String[][] copyTo = args[3];							 //(2)
int startToX = Integer.parseInt(args[4]);
int lengthX = Integer.parseInt(args[5]);
int startToY = Integer.parseInt(args[6]);
int lengthY = Integer.parseInt(args[7]);

int stopY = startFromY + lengthY;

for(int i = startFromY; i < stopY; i++) {
  System.arraycopy(copyFrom[i], startFromX, copyTo[i], startFromX, lengthX); //(3)
}

 }

}

Får feilmelding:

incompatible types

found : java.lang.String

required: java.lang.String[][]

på linje (1) og (2)

 

Har også prøvd med Object i stedet for String[][], men får da feilmelding:

array required, but java.lang.Object found

på linje (3)

 

Noen tips til hvordan jeg kan ordne dette?

Det beste er jo om det kan bli fikset slik at jeg ikke bare er arrays av type String[][] som kan kopieres men også int[][] og andre typer..

Endret av toss
Lenke til kommentar
Videoannonse
Annonse
Det jeg vil er at man skriver navnet på et multi-dim-array som parameter, og så må jeg på en eller annen måte kunne jobbe med dette multi-dim-arrayet videre i metoden.. Hvordan gjør jeg det?

Først og fremst endre:

public static void copy(String args[])

til

public static void copy(String matrix[][])

 

Når du sier multi-dim, mener du da to-dimensjonalt, eller n-dimensjonalt der n kan være alt fra 1 og oppover?

 

Dersom du skal jobbe med to-dimensjonale arrays (matrise) med tall, bør du jo bruke int[][] matrix.

 

Dersom det er noe du ikke forstår med Java / programmering generelt, kan du jo bare si hva det er, slik at vi vet hvilke forståelse du har.

Endret av pgdx
Lenke til kommentar

Har lite erfaring med programmering fra før, men har derevet litt med php. Jeg opplever større problemer med feil datatype i java, dvs at jeg får error som sier at int er funnet i stedet for string eller noe. Vet ikke om det er fordi jeg gjorde helt andre ting i php og derfor ikke støtte på de problemene, eller om det er fordi java er "strengere" på dette enn php. Lærte meg heller aldri OOP når jeg drev med php, så dette er også en overgang, og det er rart å måtte se på alt som objekter, selv arrays, om jeg har forstått det rett?

 

Med multi-dim mener jeg i utgangspunktet to-dimensjonale, tror det blir for mye av det gode å lage metoden for n-dimensjonale for meg nå..

 

Ønsker også at metoden skal virke for både String[][], int[][], double[][] osv..

 

Men dersom jeg endrer til:

public static void copy(String matrix[][])

vil jeg vel fortsatt ikke greie å få plass til en rekke vanlige argumenter pluss et to-dimensjonalt array? burde det ikke i så fall være:

public static void copy(String matrix[][][])

 

 

 

EDIT: Har prøvd det siste nå, men det går heller ikke..

Så koden ser altså slik ut nå:

 

class Matrix {

 public static void copy(String[][][] args) {
String[][] copyFrom = args[0];
int startFromX = Integer.parseInt(args[1][0][0]);
int startFromY = Integer.parseInt(args[2][0][0]);
String[][] copyTo = args[3];
int startToX = Integer.parseInt(args[4][0][0]);
int lengthX = Integer.parseInt(args[5][0][0]);
int startToY = Integer.parseInt(args[6][0][0]);
int lengthY = Integer.parseInt(args[7][0][0]);

int stopY = startFromY + lengthY;

for(int i = startFromY; i < stopY; i++) {
  System.arraycopy(copyFrom[i], startFromX, copyTo[i], startFromX, lengthX);
}

 }

}

 

Og så har jeg en klasse i en annen fil som skal lage to to-dim-arrays, og kopiere med denne metoden:

 

class Kopier {
 public static void main(String[] args) {
//Deklarere variabler
String[][] matrise = {{"Anne ", "Berit ", "Heidi ", "Lise "}, 
					  {"Alfred ", "Birger ", "Jon ", "Petter "}, 
					  {"Andersen", "Fredriksen", "Hansen", "Thorsen"},
					  {"Breim", "Dombås", "Helle", "Kallstad", }};

String[][] kopierTil = new String[4][4];

Matrix.copy(matrise, 0, 0, kopierTil, 0, 4, 0, 4);							  //(1)

System.out.println(kopierTil[1][3]);
System.out.println(kopierTil[2][1]);
 }
}

 

Da får jeg denne feilmeldingen:

copy(java.lang.String[][][]) in Matrix cannot be applied to (java.lang.String[][],int,int,java.lang.String[][],int,int,int,int)

på linje (1).

 

Noen tips?

Endret av toss
Lenke til kommentar

Kanskje ikke den kjekkeste oppgaven du har tatt for deg (generics er ikke lett i begynnelsen).

 

	public static void main(String[] args) {
	Random r = new Random();
	Integer[][] a = new Integer[5][6];
	for (int i = 0; i < a.length; i++) {
		for (int j = 0; j < a[i].length; j++) {
			a[i][j] = r.nextInt(100);
		}
	}
	Integer[][] b = copy(a);

	for (int i = 0; i < a.length; i++) {
		for (int j = 0; j < a[i].length; j++) {
			System.out.println(a[i][j] + "\t=\t" + b[i][j]);
		}
	}
}

public static <T> T[][] copy(T[][] t) {
	T[][] n = t.clone();
	for (int i = 0; i < t.length; i++) {
		n[i] = t[i].clone();
		for (int j = 0; j < t[i].length; j++) {
			n[i][j] = t[i][j];
		}
	}
	return n;
}

Lenke til kommentar

Fikk det til nå! Løsningen var altså å angi datatype på parameterne i selve metodedeklarasjonen.. Fikk ideen fra deg, pgdx, men gjorde om på min egen klasse slik at jeg nå kan angi akkurat hvilke verdier jeg vil kopiere, og lagde den også for å kopiere strenger ikke int.

class Matrix {

 public static void copy(String[][] copyFrom, int startFromX, int startFromY, 
String[][] copyTo, int startToX, int lengthX, int startToY, int lengthY) {

int stopY = startFromY + lengthY;

for(int i = startFromY; i < stopY; i++) {
  System.arraycopy(copyFrom[i], startFromX, copyTo[i], startToX, lengthX);
}

 }

}

 

Men så et spørsmål til slutt.. Hva sier egentlig denne metodedeklarasjonen? Tenker spessielt på dette med <T>..

public static <T> T[][] copy(T[][] t) {

Lenke til kommentar

Det er type, datatype... Integer, Double, String, noe annet.

 

I metodedeklarasjon: public static <T> T[][] copy(T[][] t)

Når du bruker metoden: (se pgdx sitt eksempel)

Du kan nærmest (i eksemplet) se det slik at metodedeklarasjonen er blitt til: public static Integer[][] copy(Integer[][] t) - ikke under kjøring, men ved kompilering.

Metodene som er brukt i metoden copy i eksemplet funker fordi alle objekter i java arver fra java.lang.Object

 

Er kanskje lettere å forstå med klasser. Generiske typer kan brukes for hele klasser og Interface-s.

Deklarasjoner: Interface List<E> og public class ArrayList<E> extends AbstractList<E> implements List<E>

I bruk (kun ett eksempel): List<String> liste = new ArrayList<String>();

Ikke heng deg opp i at det står <E> istedet for <T>, det er en konvensjon for Collections-rammeverket eller noe slikt (Collections inneholder Elementer).

 

Java er strengere mht datatyping enn PHP, ja (understatement). Uten at jeg akkurat behersker PHP, og tør ikke sammenligne for mye.

 

For å putte objekter av ulike datatyper i samme array ville det vært mulig å bruke en supertype (Object kan sees på som alle objekters implisitte supertype, aller øverst i arvehierarkiet).

Object[] arr = new Object[2];
arr[0] = new Integer(1);
arr[1] = new String("Hei");

for (Object o : arr) {
	System.out.println(o); // skriver ut resultatet av o.toString()
}

// Hva hvis man trenger å bruke String-metoder?
for (Object o : arr) {
   // Typesjekk
   if (o instanceof String) {
		// Casting
		String s = (String) o;
		System.out.println(s.charAt(0));
  }
}

Men at noe er mulig betyr ikke nødvendigvis at det er en fornuftig løsning...

 

Collections-rammeverket og List<E> gjør f.eks. at man kan bruke List<Integer> og for elementene i listen benytte alle metoder fra Integer, uten å trenge stygge instanceof-sjekker eller å caste - kompilatoren kan dermed hindre en del ubehagelige overraskelser som ellers ville kunne oppstått under kjøring. Før java 5.0/1.5 var alle elementer i Collection-lister av type Object... av og til kan kode med typeangivelse se litt drøy ut og ikke minst være plagsom å skrive, som (for å overdrive litt) "List<List<Map<String, Integer>>>", men lær deg å like det. ;)

 

 

I koden din slik den er så kan du selvfølgelig kun kopiere String[][]-arrays med metoden copy, men hvis det er alt du trenger så...

 

 

Begynner å bli sent/tidlig nå, håper dette innleggende er noenlunde sammenhengende og helst også korrekt. ;)

Endret av Cyberfrog
Lenke til kommentar

Ja, strengt tatt er det bedre å bruke Collections istedet for arrays. Det er greit nok for øving men sånn ellers burde man bruke List / Collection og en passende implementasjon. Eller skrive sin egen implementasjon hvis man føler seg vågal. ;)

 

Apache Commons Collections biblioteket har også klasser som utvider Collections enda mer.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...