Permalänk
Medlem

sortera array, vad är fel?

Programmet ska läsa in text från en fil, sedan sortera arrayen efter namn, titel. Efter sorteringen ska info skrivas till ny fil med det sorterade innehållet.

Min fråga är egentligen, är jag på rätt spår. Har suttit i nästan ett dygn nu. Är inte alls säker på det som står efter "sortering", är egentligen inte dundersäker på det andra heller.

All hjälp tas tacksamt emot!

import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { int lines = 0; String txtLine; //hämta fil File txtFile = new File("skivor.txt"); //läser filen try {FileReader fileReader = new FileReader (txtFile); BufferedReader lineReader = new BufferedReader (fileReader); while ( (txtLine = lineReader.readLine()) != null) { lines++; } lineReader.close(); fileReader.close(); } catch (IOException io) { System.out.println("Fel i inläsning"); } CD[] myArray = new CD[lines]; try {FileReader fileReader = new FileReader(txtFile); BufferedReader lineReader = new BufferedReader(fileReader); int cdIndex = 0; while ( (txtLine=lineReader.readLine()) != null) { String[] category = txtLine.split(" "); myArray[cdIndex] = new CD(); if (category.length == 2) { myArray[cdIndex].setArtist (category[0]); myArray[cdIndex].setTitle (category[1]); } if (category.length == 7) { myArray[cdIndex].setArtist (category[0]); myArray[cdIndex].setTitle (category[1]); myArray[cdIndex].setGenre (category[2]); myArray[cdIndex].setRecordLabel (category[3]); int utgivningsår = Integer.parseInt(category[4]);//omvandlar myArray[cdIndex].setReleaseYear (utgivningsår); int antal = Integer.parseInt(category[5]);//omvandlar myArray[cdIndex].setNrSongs (antal); Scanner doubleScanner = new Scanner(category[6]); double speltid = doubleScanner.nextDouble(); myArray[cdIndex].setTotalTime(speltid); doubleScanner.close(); } cdIndex++; } lineReader.close(); //stänger lineReader fileReader.close(); //stänger fileReader } //felkontroll catch (IOException ioe) { System.out.println("Ett fel uppstod"); } //sortering? class Sort { public int findMin(CD[] cdArray, int startIndex) { int min = startIndex; for(int i = startIndex+1; i < cdArray.length ; i++) { if ( cdArray[i].getArtist().compareTo(cdArray[min].getArtist()) < 0) { min = i; } } return min; } public void sort(CD[] cdArray ){ for(int i = 0; i<cdArray.length-1;i++){ // sök minsta int least = findMin(cdArray, i); // byt CD tmp=cdArray[least]; cdArray[least]=cdArray[i]; cdArray[i]=tmp; System.out.println(cdArray[least].getArtist()); } } } } }

Permalänk
Medlem

Jag skulle råda dig att använda en dynamisk Array istället - ArrayList. Då behöver du inte på förhand sätta storleken på den och slipper då läsa in filen två gånger och lägger sedan bara till alla nya element.

Där du kollar längden på kategorin kan du avnäda else if istället, mer strukturerat och bättre så.

Istället för att anropa en massa setXXX i din CD-klass borde du skapa en konstruktor som sätter alla dessa värden vid skapandet av objektet istället. Det skulle då bli så här: new CD(category[0], category[1], category[2], ...) osv. (Inte med i koden jag skrev nedan)
Du behöver inte skapa nya integers när du ska konvertera från string till integer.

Sorteringen vet jag inte riktigt hur du löst, orkade inte sätta mig in riktigt. Men, jag skrev ner en bubblesort åt dig. Det är egentligen en rätt ineffektiv sorteringsmetod men den är lätt att förstå och jag tror inte det spelar så stor roll i ditt fall då jag antar att du inte har så många rader i din textfil.

Jag har städat upp koden lite åt dig och skrivit om lite. Inte testat själv om det funkar. Som det är skrivet nu (och innan) så läser den in filen och skapar CD-objekt för varje rad i filen och skriver sedan in infon där. Någon skrivning till fil, som du ville göra, händer inte i koden!

import java.io.*; import java.util.*; public class test { public static void main(String[] args) { ArrayList<CD> myArray = new ArrayList<CD>(); //hämta fil File txtFile = new File("skivor.txt"); //Läser in filen i en ArrayList try { FileReader fileReader = new FileReader(txtFile); BufferedReader lineReader = new BufferedReader(fileReader); String txtLine; int cdIndex = 0; while( (txtLine=lineReader.readLine()) != null) { String[] category = txtLine.split(" "); myArray.add(new CD()); if (category.length == 2) { myArray.get(cdIndex).setArtist (category[0]); myArray.get(cdIndex).setTitle (category[1]); } else if (category.length == 7) { myArray.get(cdIndex).setArtist (category[0]); myArray.get(cdIndex).setTitle (category[1]); myArray.get(cdIndex).setGenre (category[2]); myArray.get(cdIndex).setRecordLabel (category[3]); myArray.get(cdIndex).setReleaseYear (Integer.parseInt(category[4])); myArray.get(cdIndex).setNrSongs (Integer.parseInt(category[5])); Scanner doubleScanner = new Scanner(category[6]); myArray.get(cdIndex).setTotalTime(doubleScanner.nextDouble()); doubleScanner.close(); } cdIndex++; } lineReader.close(); //stänger lineReader fileReader.close(); //stänger fileReader } catch(IOException ioe) { System.out.println("Ett fel uppstod"); } } private static void bubbleSort(CD[] cdArray) { boolean swapped; do { swapped = false; for (int i = 0; i < cdArray.length - 1; i++) { if (cdArray[i].getArtist().compareTo(cdArray[i+1].getArtist()) < 0) { //Byt plats CD tmp = cdArray[i]; cdArray[i] = cdArray[i+1]; cdArray[i+1] = tmp; swapped = true; } } } while (swapped); } }

Permalänk

Förutom de saker som ChRiiLLe påpekade så kan jag rekommendera att använda Java's inbyggda sorteringsfunktion:

Collections.sort(myArray, new Comparator<CD>() { public int compare(CD o1, CD o2) { return o1.getArtist().compareTo(o2.getArtist()); } });

Om du stoppar in det där du skrivit //sortering? så borde det fungera. Det finns flera fördelar med att använda en färdigskriven sorteringsalgoritm; man kan anta att de har valt en effektiv algoritm, och risken för buggar minskar om man använder färdiga funktioner istället för att duplicera koden själv.