webForumDet fria alternativet

Sortering av array

16 svar · 1 384 visningar · startad av PollyJuice

PollyJuiceMedlem sedan mars 2006126 inlägg
#1

Jag har kört fast på ett projekt. Uppgiften går ut på att läsa in en textfil innehållande en lista på artister och deras CD-skivor, varefter varje rad ska läggas i en array för att sen sorteras i bokstavsordning och skrivas ut som en ny textfil.

Jag har klarat av att få programmet att läsa in textfilen och lägga varje hel rad (typ "Shania_Twain Come_On_Over") i varsitt index. Nu undrar jag bara hur jag ska bära mig åt för att sortera arrayen. Hur ska jag dela upp varje rad i artist respektive titel, och hur ska de båda hållas ihop under sorteringen, så att jag inte får en utskrift där det står "ABBA, Come_On_Over, Gold, Shania Twain, osv"?

Har fått tips om att använda mig av en särskild klass CD, och där använda konstruerarna new CD(); och metoderna getTitle, setTitle, osv.

Kan nån ge mig en knuff i rätt riktning, är ni snälla?

FlexbertMedlem sedan jan. 200670 inlägg
#2

Gör en databas klass där du sköter Arrayen och i arrayen lagrar du item objekt.
Ett item interface där du definierar de metoder alla föremål kan ha. Ifall du skulle vilja ha fler saker än CD-skivor.
En CD klass som implementerar interfacet, i CD klassen konstruerar du dina CD-objekt. I objekten kan du lagra Artist/Titel/Utgivningsår.

  System.out.println(d.get(i).getTitle());

Skriver ut objektets title.
d=databas objektet
get(i)=metod i databasen som ser till till att objektet finns i arrayen (fångar ev fel)
getTitle(); finns def i interfacet(enbart kroppen), hur den fungerar beskriver tex klassen CD.

Fråga lite mer, kanske är helt fel ute?

PollyJuiceMedlem sedan mars 2006126 inlägg
#3

Eeeeh...va? :q

Såhär långt har jag hunnit:

   package lab5;

import java.io.*;
import java.lang.*;
import java.util.*;

public class Main {

public void readCDsFromFile(String filnamn_arg) {
    try {
        BufferedReader lineReader = new
                BufferedReader(new FileReader("H://Java/text/lab5/skivor.txt"));
        line = lineReader.readLine();
        String \[\] myArray;
        while (line != null) {
            for (int i = 0; i \< myArray.length; i++) {
                myArray *\= line;
                line = lineReader.readLine();
            }
        }
        lineReader.close(); //Stanger lineReader
    } catch (IOException ioe) {
    }
    // programmet har nu läst in varje rad i textfilen 
    // och lagt varje rad i ett index.
}*

Nu när textfilen har lästs in och varje rad har lagts i varsitt index i arrayen. Nu ska jag dela upp varje rad i artist respektive titel, för att sen sortera varje CD-skiva efter vilken artist som finns med på skivan. Från A-Ö.

FlexbertMedlem sedan jan. 200670 inlägg
#4

nej nej nej. Det där blir bara jobbigt, java är objektorienterat.

Lagra objekt i din array.
Använd en delimiter och plocka ut artist/titel.
Sen stoppar du in dem i ditt CD-objekt!

PollyJuiceMedlem sedan mars 2006126 inlägg
#5

Jag är total nybörjare, jag vet inte hur man gör! :r

FlexbertMedlem sedan jan. 200670 inlägg
#6

Ett interface
Item.java

public interface Item{
		//Returnerar objektets title
		public String getTitle();
		//Returnerar objektets artist
		public String getArtist();	
}

Objektklassen
CD.java

public class CD implements Item{
	private String artist;
	private String title;

	public CD(String artist, String title){
	this.artist=artist;
	this.title=title;
	}
	
	public String getArtist(){
	return artist;
	}
	public String getTitle(){
	return title;
	}

}

Databasklassen
Database.java

public class Database{

	public static void main(String[] args){
	String artist="Madonna";
	String title="Confessions On A Dance Floor";
	Item cd = new CD(artist,title);
	System.out.println(cd);
	System.out.println(cd.getTitle());
	System.out.println(cd.getArtist());
	}

}

Testa så kanske du förstår hur bra objekt är =). Lämnar dock en hel del att göra, men du får se det som en introduktion till hur objekt funkar.

PollyJuiceMedlem sedan mars 2006126 inlägg
#7

Okej, så Item delar upp objekten i artist respektive titel. Men hur kan jag lägga in CD-skivorna som objekt? Jag är tvungen att läsa in en textfil och hämta rad för rad från den, alltså har jag inga uppgifter att skriva in i databasklassen, utan de uppgifterna ska hämtas ifrån raderna i textfilen.

thojo280Medlem sedan dec. 200463 inlägg
#8

Håller med

Jag håller med Flexbert. Gör det objektorienterat. Vitsen med Interfacet är att du sedan kan skapa en klass som heter LP och fortfarande kalla det ett Item. Skalbart och fint..

PollyJuiceMedlem sedan mars 2006126 inlägg
#9

Ni har säkert rätt, problemet är bara att jag är nybörjare och inte kan särskilt mycket om Java, och därför har jag svårt att hänga med.

Anledningen till att jag tjatar om en textfil är att det ingår i den uppgift jag fått att lösa. Jag har försökt allt; jag har plöjt igenom halva biblioteket, frågat läraren, kollat med klasskompisar, och jag kommer ingen vart alls.

Kan ni förklara det övertydligt, som om jag vore 7 år? Det skulle faktiskt hjälpa... :r

FlexbertMedlem sedan jan. 200670 inlägg
#10

PollyJuice skrev:

Okej, så Item delar upp objekten i artist respektive titel. Men hur kan jag lägga in CD-skivorna som objekt? Jag är tvungen att läsa in en textfil och hämta rad för rad från den, alltså har jag inga uppgifter att skriva in i databasklassen, utan de uppgifterna ska hämtas ifrån raderna i textfilen.

Nja interfacet är mer en mall för vad vår CD-klass ska innehålla, det är ju i CD-klassen all kod finns.
Ja, då tar du och tittar i textfilen ifall du har något speciell avgränsare.
Typ | tecknet. Sen använder du ett Scanner objekt.

FileInputStream input = new FileInputStream("filename.txt");
Scanner s = new Scanner(input);
Scanner readRow = new Scanner(s.nextLine()).useDelimiter("|");
do{
String artist = readRow.next();
String title = readRow.next();
//Här får du skapa ett objekt och sen slänga in det i din array.
}while(s.hasNextLine());

Scanner måste importeras men den ligger i util. import java.util.*;
Sen sparar du din fil med samma avgränsningar så den går att läsa in igen. Denna lösning är inge vidare ifall man vill mata in från tangentbordet, men en sak i taget.

Ooops, kopierat lite väl mycket från en gammal labb. Nu torde allt va rätt.

PollyJuiceMedlem sedan mars 2006126 inlägg
#11

Har jag fattat dig rätt om jag tror att jag ska använda FileInputStream ISTÄLLET FÖR File Reader och BufferedReader?

Och objekten som ska skapas och läggas i arrayen, visst ska jag använda mig av CD-klassen för det?

PollyJuiceMedlem sedan mars 2006126 inlägg
#12

Behöver jag interfacet Item? Det står ju samma sak i klassen CD? Vad gör isåfall Item som gör att den behövs för klassen CD?

FlexbertMedlem sedan jan. 200670 inlägg
#13

Måste laga middag & träna, återkommer ikväll. Under tiden rekommenderar jag google =).

FlexbertMedlem sedan jan. 200670 inlägg
#14

PollyJuice skrev:

Har jag fattat dig rätt om jag tror att jag ska använda FileInputStream ISTÄLLET FÖR File Reader och BufferedReader?

Och objekten som ska skapas och läggas i arrayen, visst ska jag använda mig av CD-klassen för det?

Vilken du använder av dem kvittar nog, eller vad de innehåller står i API:et. Jag vet inte, men båda funkar nog.

Det du ska lagra i din array är Item, vilka du har en fin mall för. Just nu har du bara ett enda Item objekt CD men i framtiden kan de bli fler(DVD/LP etc). Dessutom skulle jag ta en titt på ArrayList i API:et, så slipper du oroa dig för att Arrayen tar slut.

Du förlorar inget på att använda ett interface utan vinner bara på det. Likabra att lära sig rätt från början.

HiDensityMedlem sedan dec. 20051 644 inlägg
#15

Jag skulle tro att Item och interface är aningens overkill för den skoluppgift som PollyJuice ska lösa. Eftersom han är nybörjare så är det nog bättre att hålla det på just nybörjarnivå.

För att dela upp strängen i artist och låtnamn gör du såhär:

artist = line.substring(0,line.indexOf(" "));
låtnamn = line.substring(line.indexOf(" ")+1,line.length());
PollyJuiceMedlem sedan mars 2006126 inlägg
#16

Ny vecka, nya tag... såhär ser koden ut för tillfället:

package lab5;

import java.io.*;
import java.lang.*;
import java.util.*;

public class Main {

public void readCDsFromFile(String filnamn_arg) {
String myArray\[\];
    try {
              FileInputStream input = new FileInputStream("H://Java/text/lab5/skivor.txt");
        Scanner s= new Scanner(input);
        
        do{
            Scanner readRow = new Scanner(s.nextLine()).useDelimiter("\|");
            String artist= readRow.next();
            String title = readRow.next();

//Här får du skapa ett objekt och sen slänga in det i din array.
}while(s.hasNextLine());
String cd = new CD();
for (int j=0; j < myArray.length; j++){
myArray[j] = cd;
}
} catch (IOException ioe){}
}
}

Jag ändrade på dbLoad, därför att netBeans inte godkände den - jag använder ju inte en databas utan läser in en fil. Jag skrev s, vilket ju står i Scanner s =new Scanner osv. MEN - netBeans godkänner inte det här heller, utan påstår att den inte kan hitta konstrueraren CD.

HiDensityMedlem sedan dec. 20051 644 inlägg
#17

PollyJuice skrev:

do
{
  Scanner readRow = new Scanner(s.nextLine()).useDelimiter("|");
  String artist= readRow.next();
  String title = readRow.next();
} while(s.hasNextLine());

1. lägg deklareringen av strängarna utanför loopen
2. sist i loopen måste du spara dina två strängar artist och title i något annat, annars skrivs de över nästa varv. Antingen i en array eller i ett cd-objekt om det är så du ska göra.

PollyJuice skrev:

String cd = new CD();

Det här är inte rätt, du har satt identifierartypen till String men försöker spara ett objekt av type CD() i den.

Har du skapat en CD-klass?
Om du har en CD-klass som tar emot artist och title i konstruktorn så ska du skriva något i stil med:

String artist = "", title = "";
ArrayList cdlista = new ArrayList();
Scanner readRow = null;
do
{
  readRow = new Scanner(s.nextLine()).useDelimiter("|");
  artist = readRow.next();
  title = readRow.next();
  cdlista.add(new CD(artist,title));

} while(s.hasNextLine());

Slå upp de saker du inte känner igen i Javas API: http://java.sun.com/j2se/1.5.0/docs/api/

Genererad på 381 ms · cache AV · v20260730165559-full.f96bc7eb