Avatar billede roschmann Nybegynder
12. februar 2004 - 14:45 Der er 9 kommentarer og
1 løsning

HEAP \ HashMap (Class java.lang.ClassCastException )

Nu har jeg siddet og kigget på dette "lort" i mere end 2 timer...og det vil bare ikke!! HJÆLP!

Bliver ved med at få en (Class java.lang.ClassCastException) ved denne linie kode:

minHob = (hob) minMap.get(_dato);

i min min_HashMap klasse, selvom min ind-metode (i samme klasse) bruger fuldstændigt den samme linie kode og her virker det fint!!!!


her er min kode (det er 4 java filer - 3 klasse og en test(main))

1. klasse > projekt

public class projekt {
    private String navn;
    private int priotet;
    private String beskrivelse;
    private int start;      //Dato...format?
    private int slut;        //Dato...format?
    private min_HashMap hMap;
   
// constructor
    public projekt(String _navn, int _priotet, String _beskrivelse, int _start, int _slut, min_HashMap _hMap) {
        navn        = _navn;
        priotet    = _priotet;
        beskrivelse = _beskrivelse;
        start      = _start;
        slut        = _slut;
        hMap        = _hMap;
       
        for (int i = start; i <= slut; i++){
            _hMap.ind(""+i, this);
        }
    }
   
// set-metoder
    public void setPriotet(int p) {
        priotet = p;
    }
   
    public void setStart(int s) {
        start = s;
    }
   
    public void setSlut(int s) {
        slut = s;
    }
   
// get-metoder
    public String getNavn() {
        return navn;
    }
       
    public int getPriotet() {
        return priotet;
    }
             
    public int getStart() {
        return start;
    }
   
    public int getSlut() {
        return slut;
    }
   
    public String getBeskrivelse() {
        return beskrivelse;
    }
   
    public void udskriv(projekt p) {
        System.out.println("----------------------------------------------------");
        System.out.println("PRIOTET    > " + p.getPriotet());
        System.out.println("NAVN        > " + p.getNavn());
        System.out.println("BESKRIVELSE > " + p.getBeskrivelse());
        System.out.println("START DATO  > " + p.getStart());
        System.out.println("SLUT DATO  > " + p.getSlut());
        System.out.println("----------------------------------------------------");
    }
   
}


2. klasse > hob

public class hob {                 
    // minimums-hob > mindste node = rod
    private projekt[] hob;         
    // array til indsættelse af projekt obj'er
    private int index = 1;         
    // index skal altid pege på næste tomme plads i arrayet
    // derfor initialiseres den med værdien 1, da vi ikke ønske at bruge plads 0 i arrayet
    private String status;
    // til hobStatus metoden
    private String dato;
   
// contructor //
    public hob(String _dato) {
        hob = new projekt[16];
        // opretter en ny hob med størrelsen 16-1 = 15 (plads 0 bruges ikke)
        dato = _dato;
    }
   
// metoder //
    public void insert(projekt p) {
    // insert metode....XXXX....
       
        if(index == 1) {       
            hob[1] = p;
            // hvis index = 1 er hoben tom, og det nye obj skal indsættes som rod (rod=1)
            index++;           
            // index tælles 1 op hver gang der indsættes i arrayet,
            // såden at index altid peger på den næste tomme plads i arrayet
        }
       
        else { // hvis index > 1 (...eller mindre, men det skal helst ikke forekomme!)
            int midlertidigtHul = index;
            // plads i arrayet hvor der er hul til en node
            int parentIndex = index/2;         
            // find parent til ny tom node
            int nytObjPrio = p.getPriotet();   
            // hent nyt obj's priotet
            int parentPrio = hob[index/2].getPriotet();
            // hent parent's (til ny tom node) priotet
           
            if(nytObjPrio > parentPrio) {
            // hvis det nye obj har en lavere priotet(dvs en større int > det er jo en minimums hob)   
                hob[index] = p;           
                // insert projekt-obj bagerst i arrayet
                index++;   
                // index tælles 1 op hver gang der indsættes i arrayet,
                // såden at index altid peger på den næste tomme plads i arrayet
            }             

            else {
                while(nytObjPrio <= parentPrio && index >1 ) {
                    //....XXXX....
                    hob[midlertidigtHul] = hob[parentIndex];
                    // rykker parent ned
                    midlertidigtHul = parentIndex;
                    // sætter midlertidigtHul til at pege på det nye hul i hoben,
                    // altså der var parent er blevet flyttet fra
                    if(parentIndex == 1)
                    // dvs hvis vi har nået roden skal der stoppes
                        break;
                        // der hoppes ud af WHILE
                    else{
                        parentIndex = parentIndex/2;
                        // finder den nye parent til midlertidigtHul
                        parentPrio = hob[parentIndex].getPriotet();
                        // finder den nye parents priotet, som bruges til,
                        // at undersøge betingelse i WHILE
                    }// else
                }// while

                hob[midlertidigtHul] = p; 
                // nyt obj indsættes på plads midlertidigtHul, som skulle være
                // det korrekte sted at indsætte det nye objekt efter kontrol
                // i WHILE løkken
                index++;   
                // index tælles op, sådan at næste gang der indsættes
                // blive det bagerst i arrayet                   
            }// 2.else
           
        }// 1.else
       
    }// insert
   
    public projekt sletMinimum() {
    //....XXXX....
        projekt min = hob[1]; 
        // minimum skal returneres....XXXX....
    hob[1] = hob[index-1]; 
        // flyt sidste element til roden....XXXX....
    index--;
        // ....XXXX....
    skubNed (1);
        // ....XXXX....
    return min;
        // ....XXXX....
    }
   
    private void skubNed (int rod) {
    // ....XXXX....
        projekt temp;
        // ....XXXX....
    int j = 2*rod;
        // index for evt venstre barn....XXXX....
       
    if (j <= index) {           
        // der er et venstre barn....XXXX....
            if (j < index && hob[j].getPriotet() > hob[j+1].getPriotet()) {
            //....XXXX....
        j++;
            // der er et mindre hoejre barn....XXXX....
            } // 2.IF
           
            if (hob[rod].getPriotet() > hob[j].getPriotet()) {
            // der skal ombyttes....XXXX....
                temp = hob[rod];
        hob[rod] = hob[j];
        hob[j] = temp;
        skubNed (j); 
                // traet nedenfor ordnes....XXXX....
            } // 3.IF
           
        } // 1. IF
    } // skubNed
   
    public String hobStatus() {
    //....XXXX....
        if(index == 1)
            status = "Hoben er tom";
        else
            if(index < 16) status = "Der er stadig plads i hoben";
            if(index == 16)
                status = "Hoben er fuld, og der kan ikke indsættes flere projekter!";
        return status;
    }
   
    public String toString () { // toString metode
        String s = "";
        for (int i=1; i<= index-1; i++)
            s = s + "  " + hob[i].getPriotet();
        return s;
    }
   
    public int getIndex() {
        return index;
    }
   
    public void udskrivAlle() {
        int i = 1;
        while (i < index-1) {
            projekt p = hob[i];
            p.udskriv(p);
            i++;
        }
    }
   
    public void udskrivEn() {
        int i = index;
        projekt p = hob[i];
        p.udskriv(p);
    }

}// hob


3. klasse > min_HashMap

import java.util.*;

public class min_HashMap {
    private projekt mitProjekt;
    private hob minHob;
    private HashMap minMap;
   
    public min_HashMap() {
        minMap = new HashMap();
    }
   
    public void ind(String _dato, projekt _p) {

        minHob = (hob)minMap.get(_dato);
        if(minHob == null)
            minHob = new hob(_dato);
        minHob.insert(_p);
        minMap.put(_dato, _p);
//minMap.put(dato, minHob);
    }
   
    public void out(String _dato) {

        minHob = (hob) minMap.get(_dato);

        if(minHob == null) //der findes ikke en hob på denne dato
            System.out.println("Der er ikke oprettet en hob på denne dato");
        else
            minHob.udskrivAlle();
    }
   
    public HashMap getHashMap(){
        return minMap;
    }
   
}


4.klasse > (main) hobTest

import java.util.*;

public class hobTest {

    public hobTest() {
    }
   
    public static void main(String[] args) {
       
        String status, s;
        int index;
        projekt minimum;
        min_HashMap minHashMappe;

        minHashMappe = new min_HashMap();
       
//        status = h.hobStatus(); System.out.println(status + "\n");
        // udskriver hobens status

// public projekt(String _navn, int _priotet, String _beskrivelse, int _start, int _slut, min_HashMap _hMap)
       
// inserts
        projekt _1 = new projekt("Frank", 10, "A", 2004100, 2004101, minHashMappe);
        minHashMappe.out("2004100");
        //minHashMappe.ind(2004101,_1);
        System.out.println("Array'et er prioteret som følger: ");
        //System.out.println("" + h);
        //status = h.hobStatus(); System.out.println(status + "\n");
       


// udtagning af top priotet = sletning af top priotet
       
/*        index = h.getIndex();
       
        for (int i=0; i<index-1; i++)
        {
        minimum = h.sletMinimum();
                System.out.println("----------------------------------------------------------------------");
                System.out.println("Følgende priotet er taget ud, og er dermed næste arbejdsopgave i dag: ");
                System.out.println("PRIOTET    > " + minimum.getPriotet());
                System.out.println("NAVN        > " + minimum.getNavn());
                System.out.println("BESKRIVELSE > " + minimum.getBeskrivelse());
                System.out.println("START DATO  > " + minimum.getStart());
                System.out.println("SLUT DATO  > " + minimum.getSlut());
                System.out.println("Hoben ser nu ud som følger: " + h);
                status = h.hobStatus(); System.out.println(status + "\n");
                System.out.println("----------------------------------------------------------------------");
        } */
       
    }// main
   
}
Avatar billede dsj Nybegynder
12. februar 2004 - 15:02 #1
Linien minMap.put(_dato, _p); i metoden ind(String _dato, projekt _p) putter en Project-instans i dit HashMap, mens du i den linie det går galt, forsøger at typecaste til en hop-instans.
Avatar billede roschmann Nybegynder
12. februar 2004 - 15:06 #2
ja og ?
hvad er problemet ?
Avatar billede roschmann Nybegynder
12. februar 2004 - 15:08 #3
hvorfor vil den godt typecaste i min "ind"-metode og ikke i min "out"-metode ?
Avatar billede dsj Nybegynder
12. februar 2004 - 15:12 #4
Du putter en project-instans ind, og får dermed også en project-instans ud - men du prøver at typecaste den til en hop-instans, og det kan du ikke. Du kan ikke lave et objekt om til en anden type.
Avatar billede roschmann Nybegynder
12. februar 2004 - 15:16 #5
..hmmm - hvad skal jeg så gøre ?
Avatar billede roschmann Nybegynder
12. februar 2004 - 15:19 #6
jeg er altså ikke helt med...
jeg typecaster i min ind-metode med denne linie:
minHob = (hob) minMap.get(_dato);
og der virker det fint, men ikke når jeg går det samme i min out-metode?
hvad gør jeg forkert?
Avatar billede dsj Nybegynder
12. februar 2004 - 15:22 #7
Du blander project-instanser og hop-instanser rundt i det samme HashMap - en god ide er som udgangspunkt at lade være med det.
Avatar billede roschmann Nybegynder
12. februar 2004 - 15:25 #8
OK, men det hjælper mig ikke det store. Hvad kan jeg gøre ?
Avatar billede dsj Nybegynder
12. februar 2004 - 15:25 #9
Du afvikler ind(...) før out(...), og det er først i ind() du roder forskellige objekt-typer samme i dit HashMap, derfor går det først galt i out().
Avatar billede dsj Nybegynder
12. februar 2004 - 15:26 #10
Det du skal gøre er IKKE at blande forskellige objekt-typer ind i det samme HashMap.
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