Permalänk
Medlem

Java - Sortera fält

Hej!
Har en uppgift där jag ska sortera ett fält så det lägsta värdet hamnar på index noll, näst minsta värde hamnar på index ett. Har dock trasslat in mig i koden och fastnat. I uppgiften är det angivet att man ska ha int[] f, int antal som inparametrar till metoden. När jag kompilerar koden får jag ArrayIndexOutOfBoundsException, vad gör jag fel? Och hur gör jag så att jag får en utskrift i main?

public static void main(String[] args) { int[] f1 = {7, 14, 21, 28}; sortera(f1, f1.length-1); } public static void sortera (int [] f, int antal){ for (int k=0;k<antal;k++){ int m = k; for (int i=k; k<=antal;i++) if (f[i]<f[m]) m = i; //int temp [] = new int[antal]; int temp = f[k]; f[k] = f[m]; f[m] = temp; } } }

Permalänk
Skrivet av queri:

Hej!
Har en uppgift där jag ska sortera ett fält så det lägsta värdet hamnar på index noll, näst minsta värde hamnar på index ett. Har dock trasslat in mig i koden och fastnat. I uppgiften är det angivet att man ska ha int[] f, int antal som inparametrar till metoden. När jag kompilerar koden får jag ArrayIndexOutOfBoundsException, vad gör jag fel? Och hur gör jag så att jag får en utskrift i main?

public static void main(String[] args) { int[] f1 = {7, 14, 21, 28}; sortera(f1, f1.length-1); } public static void sortera (int [] f, int antal){ for (int k=0;k<antal;k++){ int m = k; for (int i=k; k<=antal;i++) if (f[i]<f[m]) m = i; //int temp [] = new int[antal]; int temp = f[k]; f[k] = f[m]; f[m] = temp; } } }

for (int i=k; k<=antal;i++)
där är ditt fel, den inre for-satsen kommer köras tills villkoret k<=antal inte gäller längre. Detta kommer dock aldrig uppfyllas då k aldrig ändras i den satsen. När då i blir större än eller lika med antal så kommer den försöka läsa ett värde som inte finns i din vektor.

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem
Skrivet av queri:

Och hur gör jag så att jag får en utskrift i main?

Jag antar att du menar hur du kan skriva ut den färdigsorterade arrayen i konsolrutan. Det du måste göra är att iterera (loopa igenom) arrayen och konkatenera (lägga ihop) varje element med ett String objekt.

Koden ser ut så här:

String s = ""; for(int i = 0; i < f1.length; i++) s += f1[i]; System.out.println(s);

Permalänk
Medlem
Skrivet av Murloc:

Jag antar att du menar hur du kan skriva ut den färdigsorterade arrayen i konsolrutan. Det du måste göra är att iterera (loopa igenom) arrayen och konkatenera (lägga ihop) varje element med ett String objekt.

Koden ser ut så här:

String s = ""; for(int i = 0; i < f1.length; i++) s += f1[i]; System.out.println(s);

Det där skapar dock en lång sträng, brukar istället vara så att man skriver ut varje element på en rad, då kan man istället bara ha System.out.println(f1[i]); i loopen. Kan bli mycket dock ifall fältet innehåller en hel del element.

Permalänk
Medlem
Skrivet av Pether:

Det där skapar dock en lång sträng, brukar istället vara så att man skriver ut varje element på en rad, då kan man istället bara ha System.out.println(f1[i]); i loopen. Kan bli mycket dock ifall fältet innehåller en hel del element.

Det har du rätt i, min kod är dålig då det bara blir ett enda stort nummer utan någon separation av elementen; inte så väl genomtänkt av mig. Gör som Pether säger eller om du vill ha allt på en rad så kan du ta min kod och bara lägga till ett mellanrum eller något, som visas nedan.

s += f1[i] + " ";

Permalänk
Skrivet av queri:

Hej!
Och hur gör jag så att jag får en utskrift i main?

Hur vill du att det ska se ut? Ett enkelt sätt är att bara göra System.out.println(f1.toString()); men då kommer utskriften se ut ungefär såhär: [tal1, tal2, tal3,...] där tal något är talet på den platsen i vektorn.

Annars får du göra en loop som skapar den utskrift du vill ha, antingen med System.out.println() om du står ut med att det är radbrytningar med, annars är det bästa att använda en StringBuffer och formatera din sträng som du vill ha den (med en loop) och sedan skriva ut den.

Skrivet av Murloc:

Jag antar att du menar hur du kan skriva ut den färdigsorterade arrayen i konsolrutan. Det du måste göra är att iterera (loopa igenom) arrayen och konkatenera (lägga ihop) varje element med ett String objekt.

Koden ser ut så här:

String s = ""; for(int i = 0; i < f1.length; i++) s += f1[i]; System.out.println(s);

Det där blir inte bra, det kommer bli ett enda långt tal och är inte vidare snyggt enligt kodkonventionerna.

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem

Detta känns ju som en skoluppgift, men tror du att du hade fått godkänt om du använde java styrka och istället skriva det så här:

Arrays.sort(f1);

//Detta måste importeras
java.util.Arrays;

Permalänk
Medlem
Skrivet av anderjo4:

Detta känns ju som en skoluppgift, men tror du att du hade fått godkänt om du använde java styrka och istället skriva det så här:

Arrays.sort(f1);

//Detta måste importeras
java.util.Arrays;

Exakt det här. Om TS inte har fått specifikt i uppgift att skriva en egen sort method så finns det ingen mening att krångla till det.

Permalänk
Medlem
Skrivet av gaminggirl:

Hur vill du att det ska se ut? Ett enkelt sätt är att bara göra System.out.println(f1.toString()); men då kommer utskriften se ut ungefär såhär: [tal1, tal2, tal3,...]

Tyvärr fungerar inte en vanlig arrays toString metod så, de använder default-implementationen av toString från Object-klassen.

Skrivet av gaminggirl:

...annars är det bästa att använda en StringBuffer och formatera din sträng som du vill ha den (med en loop) och sedan skriva ut den.

OP är uppenbart en nybörjare som inte är så bekväm med kodning ännu, att ta upp StringBuffer eller StringBuilder blir onödigt komplicerat.

Skrivet av gaminggirl:

Det där blir inte bra, det kommer bli ett enda långt tal och är inte vidare snyggt enligt kodkonventionerna.

Adresserade problemet i inlägget precis innan ditt.