Avatar billede tlunde Nybegynder
05. august 2003 - 15:03 Der er 15 kommentarer og
2 løsninger

Sorter et LinkedList.

Hejsa,
Jeg har lavet denne funktion der shuffler objekterne i en linkedlist:

public void shuffleAllTheCards()
{
  int cardAmount;
  cardAmount = allTheCards.size();

  for(int i = 0; i <= cardAmount; i++)
  {
    Collections.shuffle(allTheCards);
  }
  System.out.println("\n INFO: The deck is now shuffled");
}

Jeg skal nu have lavet en funktion, der sortere objekterne igen, så de var på samme måde som før de blev shufflet, og der har jeg prøvet dette:

public void sortAllTheCards()
{
  Collections.sort(allTheCards);
}

Men det virker ikke rigtigt. Der kommer denne exeption:

Exception in thread "main" java.lang.ClassCastException
        at java.util.Arrays.mergeSort(Arrays.java:1122)
        at java.util.Arrays.mergeSort(Arrays.java:1129)
        at java.util.Arrays.mergeSort(Arrays.java:1129)
        at java.util.Arrays.mergeSort(Arrays.java:1129)
        at java.util.Arrays.sort(Arrays.java:1073)
        at java.util.Collections.sort(Collections.java:109)
        at solution.Deck.sortAllTheCards(Deck.java:167)
        at solution.UserInterface.sortAllTheCards(UserInterface.java:105)
        at solution.UserInterface.startProgram(UserInterface.java:48)
        at solution.RunMe.main(RunMe.java:21)

Hvad gør jeg galt?
Avatar billede riversen Nybegynder
05. august 2003 - 15:10 #1
der er et sted hvor du caster, hvor det ikke kan lade sig gøre
Avatar billede riversen Nybegynder
05. august 2003 - 15:13 #2
Avatar billede tlunde Nybegynder
05. august 2003 - 15:13 #3
Jeg kan ikke rigtigt se at der skulle være en forkert casting nogle steder i min program...

Den måde som jeg bruger sort på, er den forkert? Skal det laves på en anden måde?
Avatar billede soreno Praktikant
05. august 2003 - 15:15 #4
Betingelsen for at kunne benytte Collections.sort(..) er at du implementerer Comparable interfaced for den klasse du vil have sorteret.
Avatar billede magoo20000 Nybegynder
05. august 2003 - 15:20 #5
Hmm.. Du skulle vel ikke lave Uniopgave...

Du skal implementere Comparable interfacet ellers kan du ikke benytte Collections.sort();
Avatar billede arne_v Ekspert
05. august 2003 - 15:21 #6
Simpelt eksempel:

import java.util.LinkedList;
import java.util.Collections;
import java.util.List;

public class SortLinkedList {
    public static void main(String[] args) {
        List lst = new LinkedList();
        lst.add("CCC");
        lst.add("BB");
        lst.add("A");
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((String)lst.get(i));
        }
        Collections.sort(lst);
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((String)lst.get(i));
        }
    }
}
Avatar billede magoo20000 Nybegynder
05. august 2003 - 15:21 #7
Card skal impl. Comparable og derved skal du selv impl. metoden  public int compareTo( Object o ) {....}
Avatar billede arne_v Ekspert
05. august 2003 - 15:23 #8
Mere avanceret eksempel:

import java.util.LinkedList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortLinkedListComplex {
    public static void main(String[] args) {
        List lst = new LinkedList();
        lst.add(new Data("CCC","1"));
        lst.add(new Data("BB", "2"));
        lst.add(new Data("A", "3"));
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((Data)lst.get(i));
        }
        Collections.sort(lst, new Cmp());
        for(int i = 0; i < lst.size(); i++) {
            System.out.println((Data)lst.get(i));
        }
    }
}

class Data {
    private String v1;
    private String v2;
    public Data(String v1, String v2) {
        this.v1 = v1;
        this.v2 = v2;
    }
    public String toString() {
        return (v1 + " " + v2);
    }
    public String getV1() {
        return v1;
    }
    public String getV2() {
        return v2;
    }

}

class Cmp implements Comparator {
    public int compare(Object o1, Object o2) {
        return ((Data)o1).getV1().compareTo(((Data)o2).getV1());
    }
    public boolean equals(Object obj)  {
        return false;
    }
}
Avatar billede arne_v Ekspert
05. august 2003 - 15:24 #9
Det simple eksempel sorterer efter "natural order".

Det mere komplekse eksempel sorterer med en bruger bestemt ordering.
Avatar billede tlunde Nybegynder
05. august 2003 - 15:37 #10
Jeg har lavet denne compareTo metode nu, og den virker også fint nok,hvor den sortere efter cardName, men hvordan udvider jeg den, så den efter at have sorteret carName, også sortere cardNumber??

    public int compareTo(Object newCard)
    {
        int result = cardName.compareTo(((Card)newCard).cardName);
        return result;
    }
Avatar billede magoo20000 Nybegynder
05. august 2003 - 15:40 #11
Hmmm..
  public int compareTo( Object o ) {
        Card c = ( Card ) o;
        int typeCmp = type.compareTo( c.type );
        if ( typeCmp == 0 )
            return vaerdi.compareTo( c.vaerdi );
        else
            return typeCmp;
    }
Avatar billede arne_v Ekspert
05. august 2003 - 15:41 #12
Det må vel være noget a la:

    public int compareTo(Object newCard)
    {
        int result = cardName.compareTo(((Card)newCard).cardName);
        if(result == 0)
        {
          result = cardNumber.compareTo(((Card)newCard).cardNumber);
        }
        return result;
    }
Avatar billede arne_v Ekspert
05. august 2003 - 15:43 #13
Hvis cardNumber skulle være en simpel data type og ikke
et objekt kan compareTo erstattes af et god gammeldags minus.
Avatar billede tlunde Nybegynder
05. august 2003 - 16:00 #14
Når jeg bruger denne metode:

public int compareTo(Object newCard)
    {
        int result = cardName.compareTo(((Card)newCard).cardName);
        if(result == 0)
        {
          result = cardNumber.compareTo(((Card)newCard).cardNumber);
        }
        return result;
    }

kommer der denne compile fejl:

int cannot be dereferenced
return cardNumber.compareTo( temporary.cardNumber );
                ^
Avatar billede tlunde Nybegynder
05. august 2003 - 16:04 #15
Jeg fik vist fat i den forkerte compile fejl, her er den rigtige der passer til dit forslag arne_v:

int cannot be dereferenced
result = cardNumber.compareTo(((Card)newCard).cardNumber);
Avatar billede arne_v Ekspert
05. august 2003 - 16:05 #16
Det er så fordi cardNumber er en int (simpel data type).

    public int compareTo(Object newCard)
    {
        int result = cardName.compareTo(((Card)newCard).cardName);
        if(result == 0)
        {
          result = cardNumber - ((Card)newCard).cardNumber;
        }
        return result;
    }
Avatar billede tlunde Nybegynder
05. august 2003 - 16:19 #17
Det virker som det skal nu...takker mange gange!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester