vectorprobleme

Status
Nicht offen für weitere Antworten.

skaal

Mitglied
also, ich habe mir sozusagen einen zweidimensionalen vector erstellt.

der besteht aus einem vector, der jeweils subvectoren ( bezeichnet als index ) enthält und diese dann die eigentlichen elemente ( bezeichnet als position ).
mein problem ist nun, dass wenn ich eine position über addPosition mit dem index 0 hinzufüge, ich beim auslesen für getIndex( 0 ) eine ArrayIndexOutOfBoundsException erhalte, obwohl da ja eigentlich der zuvor eingefügte index mit einem eintrag sein sollte.

der relevante code:

Code:
public class 2DVector < T > {

    private Vector < Vector < T > > indices = new Vector < Vector < T > > ( 2, 1 );

    public void addIndex ( int index ) {
        indices.add( index, new Vector < T > (  ) );
    }

    public void addPosition ( int index, T pos ) {
        try {
            indices.elementAt( index ).add( pos );
        }
        catch ( Exception e ) {
            addIndex( index );
            indices.elementAt( index ).add( pos );
        }
    }

    public Vector < T > getIndex ( int index ) {
        return indices.elementAt( index );
    }
}

kann mir von euch jemand sagen, wo der fehler liegt?
ich seh ihn nicht mehr.
 
B

Beni

Gast
1. Ich wundere mich nur schon, wie du das kompilieren kannst. Ein Klassennamen darf nicht mit einer Zahl beginnen...

2. Man kann die Grösse eines Vectors mit "size()" abfangen, die Methode "addPosition" kann man damit 100 schöner (und schneller) schreiben.

3. "add" fügt nicht immer genau dort was ein, wo index hinzeigt. Wenn der Vector zu klein ist, kann der Vector auch früher eingesetzt werden.

4. Konnte dein Fehler nicht anhand deines Textes nachbauen, gib doch bitte den Code dazu an.
 

skaal

Mitglied
zu 1: ja, mit dem klassenamen war was, hatte den nicht kopiert sondern nur kurz dazugeschrieben...

zu 2: ja, aber wie damit besser machen?

zu 3: mir klar, in diesem falle ist der vector sogar leer, wie gesagt arbeite ich aber mit index = 0, auch beim auslesen

zu 4: noch mehr code, ich verzichte darauf alles zu posten, weil es einfach zu viel wäre, und beschränke mich auf die wesentlichen fragmente, die die probleme direkt aufrufen und ein paar anmerkungen:

Code:
public class Colony {

        //die instanz des problemkindes
        private Vector_2D < ImprovementProduction > v_prod_imp =
                new Vector_2D < ImprovementProduction > ();

    public void produce ( Resource r ) {

            Resource p = r;
            int prods;

        prods = v_prod_imp.getIndex( 0 ).size();  //fehlerquelle
        for ( int i = 0 ; i < v_prod_imp.getIndex( 0 ).size() ; i++ ) {
            p = v_prod_imp.getIndex( 0 ).elementAt( i ).produce( p.multiply( 1 / prods ) );
        }
    }

    public Resource requestResources (  ) {

            Resource res = new Resource();

        for ( int i = 0 ; i < v_prod_imp.getIndex( 0 ).size() ; i++ )  //fehlerquelle
            res.addResource( v_prod_imp.getIndex( 0 ).elementAt( i ).getCost() );

        return res;
    }

    //v_prod_imp belegen
    private void initProduction (  ) {

            ServerRequester sr = g.getServerRequester();
            TransferrableResultSet result = null;
            TransferrableResultSet.TRSCell cell;
            int length;

        result = sr.askServer(
                "REQUEST: select * from productions_imp where PI_COLONY = " + id +
                " order by PI_QUEUE;" );
        length = result.getRowCount();
        System.out.println( "prod_imp da; " + length );
        cell = result.getFirst();

        for ( int i = 0 ; i < length ; i++ ) {

                ImprovementProduction p;

            p = new ImprovementProduction( cell, g, this );
            v_prod_imp.addPosition( p.getQueuePosition(), p );  //hier: p.getQueuePosition() = 0

            cell = cell.getNextInCol();
        }
    }
}

wie oben gesagt läuft es auf das problem beim auslesen hinaus, dass der index, der eingefügt wurde, nicht da ist und das auch noch der erste in einem leeren vector ist
 
B

Beni

Gast
Zu 3, das könnte man z.B. so machen:
Code:
public void addPosition ( int index, T pos ) {
    	if( index < indices.size() )
    		indices.get( index ).add( pos );
    	else{
    		Vector<T> next = new Vector<T>();
    		next.add( pos );
    		indices.add( next );
    	}
    }
Exceptions sind für Ausnahmesituationen gedacht, im normalen Fluss haben sie nichts zu suchen. Du benutzt ja auch deine Hände um auf der Tastatur zu tippen, und nicht den Vorschlaghammer...

Ich habe versucht deinen Code zum laufen zu bringen:
Code:
class Colony {

        //die instanz des problemkindes
        private Vector2D < String > v_prod_imp =
                new Vector2D < String > ();

    public void requestResources (  ) {
        for ( int i = 0 ; i < v_prod_imp.getIndex( 0 ).size() ; i++ )  //fehlerquelle
        	System.out.println( v_prod_imp.getIndex( 0 ).elementAt( i ) );
    }

    //v_prod_imp belegen
    public void initProduction (  ) {
        for ( int i = 0 ; i < 10 ; i++ ) {
            v_prod_imp.addPosition( 0, "bla: " + i );
        }
    }
}

Funktioniert alles wunderbar... also entweder postest du jetzt mal einen Code der den Fehler produziert, oder du suchst ihn selbst :wink:
Wenn ich dich wäre, würde ich mal den Code soweit kürzen, dass du mit wenig Code den Fehler reproduzieren kannst. Mit hoher Wahrscheinlichkeit wirst du dann auf den ersten Blick was falsches sehen, und benötigst das Forum gar nicht.
 
G

Guest

Gast
ja, du hast recht. es kann ja auch nicht gehen, wenn man den falschen konstruktor aufruft und der den vector dann nicht füllt...

:oops:

danke für die hilfe.
 
Status
Nicht offen für weitere Antworten.

Oben