4 svar
556 visningar
popelos 183
Postad: 7 jan 12:03

Uppgift 2.1 Hundregister.

Hej, 

jag har problem att förstå denna uppgift och har ej implementerat en sorterings algoritm tidigare. Men har kommit igång en del med hjälp av en video. 

Det här är uppgiften:

Såsom jag tolkar det skall vi implementera en klass DogTailComparator med en sortering som tar in två hundars svanslängd med sortering Comparator.

Men jag känner mig rätt förvirrad har skapat tre delar i VisualStudioCode för uppgiften. 

public class DogTailComparator {

    private int value;

    public DogTailComparator(int value) {
        this.value = value;
    }

    public int getValue() {
        return value; 
    }
import java.util.Comparator;

public class DogTailLengthComparator implements Comparator<DogTailComparator>{
    
   
    
    public int compare(DogTailComparator first, DogTailComparator second)  {
        if(first.getValue() < second.getValue())
            return -1;
        if(first.getValue() > second.getValue())
            return 1;

        return 0;

        

        

    }
}
public class DogTailComparatorTestProgram {
    



public static void main(String[] args) {
    DogTailComparator o = new DogTailComparator(7);
    DogTailComparator z = new DogTailComparator (10);
    System.out.println(o.getValue());
    System.out.println(z.getValue());

Jag är ingen expert som sagt men det känns som att det saknas en del grejer i DogTailLengthComparator, det är förvirrande att vi gör två klasser nu då vi skall jobba med publika klasser kan de ej vara i samma fönster. Testprogrammet känns även dåligt tror det testar fel saker.

Hur skall jag tänka för att komma vidare? 

thedifference Online 576
Postad: 7 jan 18:42

Du ska skapa

DogTailComparator implements Comparator<NamnPåDinAndraKlass, förslagsvis DogTail>

Din implementation är bra.

Det står ingenstans i uppgiften att du ska sortera något. För att kunna sortera något så behöver man ju kunna jämföra objekten för att veta vad som ska komma före vad, eller hur? Det är denna funktionalitet du skapat.

CurtJ 1264
Postad: 7 jan 20:23

Jag kompletterar med lite bakgrund så du får lite kött på benen när det gäller interface i allmänhet och Comparator i synnerhet.

Ett interface deklareras ungefär som en klass med ett antal metoder utan kod. Det är ett kontrakt som innebär att klasser som implementerar interfacet MÅSTE implementera metoderna i interfacet.

Interfacet Comparator innehåller 2 metoder, compare och equals vars syfte är att utföra jämförelser mellan två objekt och avgöra vilket som är störst. Det finns ett antal andra metoder också som har tillkommit iom Java 8 men de är default eller static så de behöver man inte implementera om man inte vill/behöver. Du behöver inte heller implementera equals då det finns i en basklass till alla klasser (Object) men om du använder det till något vettigt och vill jämföra objekt baserat på innehållet så måste du implementera det efter dina behov. 

Tänk dig att du gör en funktion som sorterar listor av heltal. Du väljer en av många sorteringsalgoritmer (eller uppfinner en egen) och sannolikheten är stor att du, baserat på algoritmen, längst ner i koden någonstans måste jämföra två tal för att avgöra vilket som är störst. 

Lite senare måste du också göra en sortering av strängar och inser att din sorteringsalgoritm fungerar bra för det också OMM du i stället för att jämföra två heltal kan jämföra två strängar enligt något kriterium.  Till din sorteringsalgoritm , som opererar på en lista, kan du då välja att skicka in metoden som gör själva jämförelsen och genom det kan du då använda sorteringen på vilken datatyp som helst som din metod kan operera på. 

Ett sätt att skicka metoder som parameter i  Java är att skicka objekt vars metoder kan anropas. Man kan antingen deklarera parametern med objektets klass men det är inte så flexibelt. Ett bättre alternativ är att deklarera parametern som ett interface och då kan man skicka in vilken nuvarande, och framtida, klass som helst som implementerar det interfacet. I ditt fall med sorteringen innebär det att objekt av klassen DogTailComparator som implementerar interfacet Comparator kan skickas in som parameter till en metod som tar en parameter av typen Comparator och också alla andra klasser som implementerar interfacet. 

I Java så finns interfacet List som implementeras av många olika typer av listor (ArrayList, LinkedLIst, Vector, Stack för att nämna några). Interfacet har en metod 

defaut void sort(Comparator<? super E> c)

 Det innebär att alla klasser som implementerar List också har en metod som heter sort. Metoden tar en Comparator<? super E> som parameter vilket betyder att du kan skicka in en klass som implementerar det interfacet Comparator av vilken typ som helst, t ex Comparator<AnyClassWillDo> och på det sättet sortera en lista av vilka objekt som helst.  

Så sammanfattningsvis, om du har en ArrayList<Dog> där Dog representerar en hund och du vill sortera den baserat på hundens svanslängd så kan du använda den inbyggda metoden sort i ArrayList (från interfacet List) men eftersom List inte vet ett dugg om hundars svanslängd så måste du tala om hur man jämför objekt av typen Dog. 

Därför implementerar du en klass, DogTailComparatort som implementerar interfacet Comparator. En implementation kan se ut så här med klassen Dog som du vill jämföra.

 

class Dog {
	// din implementation av en hund. 
	// den har förmodligen ett attribut som anger 
	// svanslängd och en getter för det	

	privat int tailLength; 

	public getTailLength() {
	    return tailLength;
	}
}

class DogTailComparator implements Comparator<Dog> {

	public int compare(Dog o1, Dog o2) {
		return o1.getTailLength() - 02.getTailLength();
	}
	
}

 

Om du nu har en lista av hundar, t ex 

ArrayList<Dog> dogsList = new ArrayList<Dog>()

så kan du sortera den på svanslängd med 

dogsList.sort(new DogTailComparator())

Det finns andra, lite modernare, sätt att utföra sortering men det här är grunderna hur det implementerades från början (ja generics tillkom senare i Java 7 vill jag minnas) men sättet att skicka metoder som parametrar och användning av interface tillhör grunderna i Java sen första versionen.  

Hoppas det ger dig lite mer kött på benen och att du med det kan lösa ditt problem. Återkom annars så hjälper vi dig. 

popelos 183
Postad: 8 jan 13:31

Läste in mig på uppgiften och fick den godkänd faktiskt vilket var skönt efter ett par timmars förvirring, tack för hjälpen och det som skulle sorteras det går säkert att implementera en ArrayList<Dog> men här skulle det vara collection som jämför två hundars svanslängder. 

Det känns som det viktigaste är att lösa saker när man kört java 3-4 veckor inte hur men såklart bra om man gör de bättre lösningarna. 

Tack för hjälpen jag återkommer med kommande uppgifter. 

RoboytoDeSantos 1
Postad: 9 feb 15:12

Hur löste du den?

Det fungerar inte alls för mig

Svara
Close