Permalänk
Inaktiv

Söka i en "2d" array [JAVA]?

Hej, jag har problem med att skirva en kod för sökning av en "2d"-array, 10 x 10. Man ska kunna söka efter ett valfritt tal och sedan få reda på om talet finns med bland den alstrade talföljden, och i så fall printa ut i vilken rad respektive kolumn den befinner sig i. Jag har ingen aning hur jag ska bära mig åt då jag ska söka i flera arrayer och få fram ett gemensamt resultat. Jag skriver ut koden, så långt jag kommit, har lyckats sortera med hjälp av att kovertera en 2d array till 1d och sedan återigen till en 2d array. (har även en mainklass som anropar dessa metoder..)

import java.util.Random; public class MetodKlass1 { private final int MaxRad = 10; private final int MaxKol = 10; public int mainArray2d[][] = new int[MaxRad][MaxKol]; public void alt1() { Random rand = new Random(); for(int r=0; r<MaxRad; r++) { for(int k=0; k<MaxKol; k++) { mainArray2d [r][k] = rand.nextInt(900) + 1; } } for(int i=0;i<mainArray2d.length;i++) { for(int j=0;j<mainArray2d[i].length;j++) { System.out.print(mainArray2d[i][j]+"\t"); } System.out.println(); } } public void alt2() { int array1d[] = new int[MaxRad*MaxKol]; int n = 0; boolean inRange = true; for( int x=0; x < MaxRad && inRange; x++) { for(int y=0; y < MaxKol && inRange; y++) { array1d[n++] = mainArray2d[x][y]; inRange = (n < array1d.length) ; } } for(int i=1; i<array1d.length; i++) { int abc = array1d[i]; int k = i - 1; while (k >= 0 && array1d[k] > abc) { array1d[k + 1] = array1d[k]; k--; } array1d[k + 1] = abc; } int position1d = 0; for(int r = 0; r < 10 ; r++) { for(int k = 0; k < 10 && position1d < array1d.length ; k++) { mainArray2d[r][k] = array1d[position1d++]; } } for(int i=0;i<mainArray2d.length;i++) { for(int j=0;j<mainArray2d[i].length;j++) { System.out.print(mainArray2d[i][j]+"\t"); } System.out.println(); } } public void SEARCH() { }

Permalänk
Medlem
Skrivet av anon174236:

Hej, jag har problem med att skirva en kod för sökning av en "2d"-array, 10 x 10. Man ska kunna söka efter ett valfritt tal och sedan få reda på om talet finns med bland den alstrade talföljden, och i så fall printa ut i vilken rad respektive kolumn den befinner sig i. Jag har ingen aning hur jag ska bära mig åt då jag ska söka i flera arrayer och få fram ett gemensamt resultat. Jag skriver ut koden, så långt jag kommit, har lyckats sortera med hjälp av att kovertera en 2d array till 1d och sedan återigen till en 2d array. (har även en mainklass som anropar dessa metoder..)

Jag kanske missförstår dig men det ser ju ut som att du har gjort allt det svåra och har problem med att göra det lätta?
Det enda som krävs är vad som skall sökas efter och en if-sats för det.

public void SEARCH(int search) { System.out.println("Söker efter: "+search); for(int i=0;i<mainArray2d.length;i++) { for(int j=0;j<mainArray2d[i].length;j++) { if (mainArray2d[i][j] == search) System.out.println("Träff på rad: "+i+" kolumn: "+j); } } }

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Inaktiv
Skrivet av Leedow:

Jag kanske missförstår dig men det ser ju ut som att du har gjort allt det svåra och har problem med att göra det lätta?
Det enda som krävs är vad som skall sökas efter och en if-sats för det.

public void SEARCH(int search) { System.out.println("Söker efter: "+search); for(int i=0;i<mainArray2d.length;i++) { for(int j=0;j<mainArray2d[i].length;j++) { if (mainArray2d[i][j] == search) System.out.println("Träff på rad: "+i+" kolumn: "+j); } } }

haha det kanske är så det funkade bra ed! tack ska du ha bara en sak, när jag ska anropa metoden från mainklassen så får jag problem om jag har int search inom parantesen längst upp. Men om jag flyttar ut den och sätter den inne i metoden så funkar det?

jag anropar den i main klassen genom att ja gjort ett objekt vid namn mk1.

när jag sedan sätter mk1.SEARCH(); så är det inte "applicable for the arguments ()".

Vill även lägga till else efter if som säger att talet inte finns med i tabellen. Problemet är att det ligger i loopen och det printas efter varje varv. Kör jag en break efter blir det var tionde gång.

Märkte också nu att när jag söker efter ett tal på rad 1 och kolumn 1 står det rad 0 och kolumn 0 i resultatet. det är ju lätt att fixa med +1 men varför blir det så. Sen så vill man ju inte att programmet kraschar om någon skulle söka med en bokstav

Permalänk
Medlem
Skrivet av anon174236:

Märkte också nu att när jag söker efter ett tal på rad 1 och kolumn 1 står det rad 0 och kolumn 0 i resultatet. det är ju lätt att fixa med +1 men varför blir det så. Sen så vill man ju inte att programmet kraschar om någon skulle söka med en bokstav

Arrayindex börjar på 0.

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem
Skrivet av anon174236:

haha det kanske är så det funkade bra ed! tack ska du ha bara en sak, när jag ska anropa metoden från mainklassen så får jag problem om jag har int search inom parantesen längst upp. Men om jag flyttar ut den och sätter den inne i metoden så funkar det?

jag anropar den i main klassen genom att ja gjort ett objekt vid namn mk1.

när jag sedan sätter mk1.SEARCH(); så är det inte "applicable for the arguments ()".

Vill även lägga till else efter if som säger att talet inte finns med i tabellen. Problemet är att det ligger i loopen och det printas efter varje varv. Kör jag en break efter blir det var tionde gång.

Märkte också nu att när jag söker efter ett tal på rad 1 och kolumn 1 står det rad 0 och kolumn 0 i resultatet. det är ju lätt att fixa med +1 men varför blir det så. Sen så vill man ju inte att programmet kraschar om någon skulle söka med en bokstav

Du kan inte anropa metoden med mk1.SEARCH(). Vi har explicit sagt att vi vill ha ett heltal som argument till metoden. Det känns ganska dumt att deklarera vad man ska söka efter direkt i metoden. Det är nog bäst att du har ett argument som säger vad man söker efter.

Du kommer få kompileringsfel innan du ens kör igång om du försöker skriva mk1.SEARCH("hejsan"). Med andra ord så kommer programmet inte att krasha eftersom det ändå inte går att starta.

Om du vill skriva ut "Hittade inget" så kan du spara en bool variabel som du sätter om du hittar en träff. När exekveringen sedan kommer ner till koden precis innan metoden returneras så kan du göra en kontroll om detta värdet är falskt/sant och skriva ut något.

Arrayer är "0-based". Vilket betyder att startpositionen är 0.
Kika mer på det här: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arra...

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Inaktiv
Skrivet av Leedow:

Du kan inte anropa metoden med mk1.SEARCH(). Vi har explicit sagt att vi vill ha ett heltal som argument till metoden. Det känns ganska dumt att deklarera vad man ska söka efter direkt i metoden. Det är nog bäst att du har ett argument som säger vad man söker efter.

Du kommer få kompileringsfel innan du ens kör igång om du försöker skriva mk1.SEARCH("hejsan"). Med andra ord så kommer programmet inte att krasha eftersom det ändå inte går att starta.

Om du vill skriva ut "Hittade inget" så kan du spara en bool variabel som du sätter om du hittar en träff. När exekveringen sedan kommer ner till koden precis innan metoden returneras så kan du göra en kontroll om detta värdet är falskt/sant och skriva ut något.

Arrayer är "0-based". Vilket betyder att startpositionen är 0.
Kika mer på det här: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arra...

Jag förstod inte riktigt hur jag skulle anropa metoden?
Sedan lyckas jag inte få till det med boolean..
Det klarnade betydligt gällande att arrayer är 0-based.

tack ska du ha

Permalänk
Medlem
Skrivet av anon174236:

Jag förstod inte riktigt hur jag skulle anropa metoden?
Sedan lyckas jag inte få till det med boolean..
Det klarnade betydligt gällande att arrayer är 0-based.

tack ska du ha

Det är inte bara arrayer som är 0 index based. Nästan alla listor är det för att vara konsekventa och för att det är "rätt". Man kan åka på en tankevurpa om man inte tar hänsyn att length och Count på "Collections" (samlingsnamn för listor/arrays) returnerar antalet objekt. Ex: En lista med tre värden har "length" = 3, men däremot positionerna 0, 1 och 2.

public void SEARCH(int search) { System.out.println("Söker efter: "+search); for(int i=0;i<mainArray2d.length;i++) { for(int j=0;j<mainArray2d[i].length;j++) { if (mainArray2d[i][j] == search) System.out.println("Träff på rad: "+i+" kolumn: "+j); } } }

Den där metoden tar emot ett argument i form av ett heltal som du kan söka efter.
För att anropa metoden så måste du använda:
mk1.SEARCH(1);
eller
mk1.SEARCH(511252);
eller liknande. Alltså endast heltal (integer).

Du kan inte använda
mk1.SEARCH();
eller
mk1.SEARCH(10,5);
eller
mk1.SEARCH("test");

Om du försöker med detta så kommer du få kompileringsfel.

För att skriva ut något om inget hittas:

public void SEARCH(int search) { bool found = false; System.out.println("Söker efter: "+search); for(int i=0;i<mainArray2d.length;i++) { for(int j=0;j<mainArray2d[i].length;j++) { if (mainArray2d[i][j] == search) { System.out.println("Träff på rad: "+i+" kolumn: "+j); found = true; } } } //Om vi inte har hittat något (found == false) så meddelar vi användaren det. if (!found) System.out.println("Ingen position hittades."); }

Det känns nästan som att du bara har kopierat din befintliga kod. Jag menar, detta är riktigt enkla saker jämfört med att sortera en array. Eller vad säger du? Det enda jag har att säga om det är att det är väldigt svårt att lära sig om man inte ta till sig hur det hänger ihop och fungerar. Självklart kan man sitta fast så man inte kommer vidare. Jag känner själv att det inte går att förklara mer än att skriva koden direkt även om jag i princip inte vill skriva ut lösningen.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Inaktiv
Skrivet av Leedow:

Det känns nästan som att du bara har kopierat din befintliga kod. Jag menar, detta är riktigt enkla saker jämfört med att sortera en array. Eller vad säger du? Det enda jag har att säga om det är att det är väldigt svårt att lära sig om man inte ta till sig hur det hänger ihop och fungerar. Självklart kan man sitta fast så man inte kommer vidare. Jag känner själv att det inte går att förklara mer än att skriva koden direkt även om jag i princip inte vill skriva ut lösningen.

ja förstår precis vad du menar. jag har en del problem att förstå ganska simpla saker då jag lätt krånglar till det i huvudet..
men jag löste detta iallafall tack så mycket för hjälpen!!