Avatar billede mightysquall Nybegynder
17. januar 2006 - 20:17 Der er 12 kommentarer og
1 løsning

Sortering af TreeMaps

Mine TreeMaps ser sådan ud: TreeMap<String, Integer>

Altså det tager String som key og Integer som value.

Mit problem er det at selvom den godt kan sortere og selvom alle keys er unikke, så når jeg adder et nyt object til TreeSet, ser det ud som om at hvis der allerede er et element med samme den value, så bliver det ene bare smidt ud af vinduet.
** Kode start **
while (i < turn.consumerList.size()){
int price = turn.consumerList.get(i).Prices().get(good);

Agents newAgent0 = new Agents(turn.consumerList.get(i).name(), price);

conSet.add(newAgent0);

i++;
}

** Kode slut **

consumerList er af typen ArrayList<Consumer> consumerList (har en class der hedder Consumer)

price er også sat til int og 0.

Er lidt forvirret over problemet...

Og hvis der er folk der har en nemmere metode til hvordan man sorterer values i treemaps, så må i godt komme med den.

På forhånd tak.
Avatar billede mikkelbm Nybegynder
17. januar 2006 - 20:23 #1
Fra dokumenationen:

"If the map previously contained a mapping for this key, the old value is replaced."

Kunne det være grunden til det du oplever?
Avatar billede mightysquall Nybegynder
17. januar 2006 - 20:25 #2
Problemet er ikke keys'ne, det er når jeg adder et nyt treemap, med en ny key, men med en gammel value at det går galt - tror bare den vælger ikke at adde den til TreeSet.
Avatar billede jakoba Nybegynder
17. januar 2006 - 21:09 #3
kan det vare at den comparator du har lavet til dine par sammenligner på prisen alene ?
Avatar billede mightysquall Nybegynder
17. januar 2006 - 21:12 #4
public class Agents implements Comparable{
    public String name;
    public Integer item;
   
    public Agents (String name, Integer item) {
        this.name = name;
        this.item = item;
    }

    public int compareTo(Object arg0) throws ClassCastException {
        return item - ((Agents)arg0).item;
    }

}

Sådan ser det ud - der skal ikke sammenlignes på keys da det skal sorteret efter value.
Avatar billede jakoba Nybegynder
17. januar 2006 - 21:47 #5
Læs her om den 'kontrakt' du skal overholde når du laver comperator til treemap's
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html
Avatar billede mightysquall Nybegynder
17. januar 2006 - 21:53 #6
Enten er det mig der misforstår dit indlæg eller også forstår du ikke mit.

Der er ikke noget kontraktbrud mellem keys - alle keys er forskellige. Problemet er hvis at der er 2 forskellige keys med den samme value, så bliver den man forsøger at adde sidst ikke addet / smidt ud af vinduet :)

Læser dog alligevel dit link igennem for at få en breddere forståelse - dog er det java 1.5.0 og ikke 1.4.2 der bruges - så ved ikke hvor meget af det jeg skal tage for gode vare? (har kigget http://java.sun.com/j2se/1.5.0/docs/api/ igennem for hjælp, men har ikke liget fundet et svar)
Avatar billede mightysquall Nybegynder
18. januar 2006 - 00:02 #7
Jeg har en tanke, men ved bare ikke hvordan jeg skal lave det.

Min tanke er at lave et sorted map med en comparator der siger den skal sorte efter value hvor den tager den mindste value først og den størte værdi til sidst - har bare ikke rigtig nogen anelse hvordan sådan en skal se ud og om det overhovedet er muligt, så hvis i kan hjælpe med at lave sådan noget, så bare se bort fra den overstående kode og gå igang med at komme med d enye ideer.

Igen.. på forhånd tak, det er en stor hjælp!
Avatar billede mightysquall Nybegynder
18. januar 2006 - 11:18 #8
Sig endelig til hvis mit spørgsmål ikke er ordentlig stillet eller at i mangler info for at kunne løse det.
Avatar billede jakoba Nybegynder
18. januar 2006 - 14:26 #9
det kunne være noget i retning af:

public class Agents implements Comparable{
    public String name;
    public Integer item;
 
    public Agents (String name, Integer item) {
        this.name = name;
        this.item = item;
    }

    public int compareTo(Object arg0) throws ClassCastException {
        return
        int priceDiff = 1 + 3 * (item - ((Agents)arg0).item);
        if ( name.compareTo( ((Agents)arg0).name ) == 0 ) {
            return priceDiff;
        } else
        if ( name.compareTo( ((Agents)arg0).name ) > 0 ) {
            return priceDiff +1;
        } else {
            return priceDiff -1;
        }       
    }
}

I dit program har du så måske behov for at sammenligne på priserne alene uafhængigt af agentens navn. Det er en separat metode du så skal definere i din klasse

    public int compareItemTo(Object arg0) throws ClassCastException {
        return item - ((Agents)arg0).item;
    }

mvh JakobA
Avatar billede jakoba Nybegynder
18. januar 2006 - 14:29 #10
Ups. den compare går galt. der skal IKKE lægges 1 til i linien
        int priceDiff = 3 * (item - ((Agents)arg0).item);
Avatar billede mightysquall Nybegynder
18. januar 2006 - 14:56 #11
Ok. Tak for din indsats jakoba :) Kom frem til noget andet via noget ArrayList der gjorde det jeg skulle - men hvis du vil kan du godt få points for dine kommentarer da de ser ret fyldestgørende ud.
Avatar billede jakoba Nybegynder
18. januar 2006 - 14:58 #12
Det er ok. tag dem selv siden du løste det selv.
Avatar billede mightysquall Nybegynder
18. januar 2006 - 15:00 #13
Ok :)
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