Domanda

Quello che sto cercando di fare è salvare una Spostare gli oggetti in un vettore chiamato topMoves. Ci saranno molti oggetti mossa che è il motivo per cui creo l'oggetto all'interno del ciclo.

I prezzi memorizza pastPriceMap per gli stock a qualche tempo (in questo caso uno minuti fa). I negozi currPriceMap prezzo per scorte po 'di tempo nel corso dell'ultimo secondo.

ottengo la seguente eccezione:

Exception in thread "Timer-0" java.util.NoSuchElementException

Questa è la linea che causa il problema:   amove.setInitPrice (pastPriceMap.get (iter.next ()));

Il frammento di codice è al di sotto. Quando faccio le dichiarazioni System.out.println Ho l'output previsto:

Iterator<String> iter = sortedTopCodes.iterator();

while(iter.hasNext()){

    System.out.println(currPriceMap.get(iter.next()));
    System.out.println(pastPriceMap.get(iter.next()));

        Move amove = new Move();
    amove.setSecCode(iter.next());
    amove.setPrice(currPriceMap.get(iter.next()));
    amove.setInitPrice(pastPriceMap.get(iter.next()));
    topMoves.add(amove);
}

    return topMoves;

La classe Sposta appare così:

private String secCode;
private double price;
private double initPrice;

public String getSecCode() {
    return secCode;
}
public void setSecCode(String secCode) {
    this.secCode = secCode;
}
public double getPrice() {
    return price;
}
public void setPrice(double price) {
    this.price = price;
}

public double getInitPrice() {
    return initPrice;
}
public void setInitPrice(double lastPrice) {
    this.initPrice = lastPrice;
}
È stato utile?

Soluzione

Risposta breve:

Per ogni chiamata a hasNext () non ci dovrebbe essere una sola chiamata a next ()

Nel codice si dispone di 5 next () con un solo hasNext ()

Qui, leggere questo: http: // java.sun.com/javase/6/docs/api/java/util/Iterator.html

Modifica

Più rispondere:

In sostanza un iteratore viene utilizzato per ... beh iterare gli elementi di "qualcosa" tipicamente una collezione, ma potrebbe essere qualsiasi cosa (scontato che nulla restituisce un Iterator).

Dal momento che non si può sapere il numero di elementi fa quel "nulla" ha, ci deve essere un modo per fermare l'iterazione giusto? (Se fosse un array, si può dire per la proprietà length, ma l'iteratore viene utilizzato per "incapsulare" la struttura dei dati impiegati per l'attuazione) Comunque.

L'API iteratore definisce questi due metodi

-hasNext(): boolean 
-next(): Object ( or <E> since Java 1.5 ) 

Così il tipico linguaggio è questo:

 while( iterator.hasNext() ) { // reads: while the iterator has next element
      Object o = iterator.next(); //  give me that element
 }

Cosa succede se l'iteratore ha solo due macchine?

 while( iterator.hasNext() ) { // the first time will return true, so the next line will be executed.

      Object o = iterator.next(); // give me that item. ( 1st element ) 

      Object b = iterator.next(); // oops dangerous by may work ... ( 2nd element ) 

      Object c = iterator.next(); // eeeerhhh... disaster: NoSuchElementException is thrown.

}

Questo è ciò che sta accadendo a voi. Lei non ha verificato se l'iteratore ha un altro elemento, basta recuperarla. Se l'iteratore succede ad avere alcuni elementi, si può lavorare per un po ', ma ci sarà un tempo (come avete appena visto) quando fallisce.

A proposito, non , anche pensare a prendere NoSuchElementException. Questa è un'eccezione di runtime e indica che qualcosa nella tua logica del codice dovrebbe essere risolto.

questa risposta per saperne di più sulle eccezioni.

Altri suggerimenti

Ecco una versione con il nuovo ciclo for:

for ( String secCode : secCodeList ) {

        System.out.println(currPriceMap.get(secCode));
        System.out.println(pastPriceMap.get(secCode));

        Move amove = new Move();
        amove.setSecCode(secCode);
        amove.setPrice(currPriceMap.get(secCode));
        amove.setInitPrice(pastPriceMap.get(secCode));
        topMoves.add(amove);
}

nel modo più vecchio:

String secCode = null;    
for ( Iterator<String> it = secCodeList.iterator(); it.hasNext() ) {
    secCode = it.next();
    System.out.println(currPriceMap.get(secCode));
    System.out.println(pastPriceMap.get(secCode));

    Move amove = new Move();
    amove.setSecCode(secCode);
    amove.setPrice(currPriceMap.get(secCode));
    amove.setInitPrice(pastPriceMap.get(secCode));
    topMoves.add(amove);
 }
// while there are more lines
while(scanner.hasNextLine())
{
    final String   line;
    final String[] words;

    // get the next line
    line = scanner.nextLine();

    // break the line up into the words (\\s+ should break it up via whitespace)
    words = line.split("\\s");

    if(words.length != 5)
    {
        throw new WhateverExceptionMakesSense(line + " must contain 5 words");
    }

    System.out.println(currPriceMap.get(words[0]));
    System.out.println(pastPriceMap.get(words[1]));

    Move amove = new Move();
    amove.setSecCode(words[2]);
    amove.setPrice(currPriceMap.get(words[3]));
    amove.setInitPrice(pastPriceMap.get(words[4]));
    topMoves.add(amove);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top