2009-05-20 16 views
7

Ho un TreeSet, che sarà pieno di interi. Per farla breve, sto provando a ricominciare da capo dopo l'ultimo (massimo) valore memorizzato nella lista. Quello che sto facendo ora per ottenere la variabile di partenza è:Oggetto Java to int: un modo migliore?

Object lastObj = primes.last(); 
    Integer last = new Integer(lastObj.toString()); 
    int start = 1 + last.intValue(); // the added 1 is just for program logic 

Sono sicuro che ci deve essere un modo migliore per lanciare un oggetto (che so che sarà sempre un int) nella int 'inizio '. Qualcuno sa di un modo migliore di farlo?

risposta

8

Si sta utilizzando la versione 1.6 di Java? In tal caso, puoi utilizzare Autoboxing e Generics per ripulire il codice.

In primo luogo, il TreeSet può essere dichiarata come contenente solo numeri interi oggetti

TreeSet<Integer> primes; 

ora per ottenere l'oggetto dal set si può

Integer last = primes.last(); 

e utilizzando la funzione autoboxing si ottiene

int start = 1 + last; 
+6

si potrebbe semplicemente fare, int start = 1 + primes.last(); –

+1

Sarebbe ancora meno codice da scrivere ... ma per illustrare il miglioramento dei generici rispetto ai miglioramenti dell'autoboxing è meglio lasciarli come dichiarazioni separate per questa risposta –

+0

Sì, vedo da dove vieni. Ho appena postato il mio commento come nota a piè di pagina. –

8

In J2SE 5 o successivo avviene automaticamente, con la funzione "autoboxing".

int start = 1 + last; 

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

Inoltre, se si sa che stanno tutti andando a essere oggetti Integer, utilizzare il tipo di parametri:

List<Integer> obj = new ArrayList<Integer>()... 

Poi si combinano con la funzione autoboxing:

int start = 1 + obj.last(); 
+2

La mia unica obiezione all'autoboxing è una situazione in cui "sembri" lavorare con ints, quindi fai un confronto == che è un confronto di riferimento, piuttosto che il confronto del valore atteso. –

+0

Ryan, pensavo che se avessi provato int == Integer, allora l'Integer avrebbe autobox in un int e Java avrebbe confrontato i due primitivi. –

+0

Quanto è vero. Ogni volta che ti affidi a qualcosa che accade automaticamente, aggiungi un altro livello di pensiero che deve accadere nella parte posteriore della tua testa. Costruttori generati automaticamente da C++! – jbm

4

Se sai che erano "int" quando sono stati inseriti, allora erano ansformed to Integer while in the Collection (le raccolte non possono contenere primitive, solo oggetti), in quanto tale, puoi semplicemente Integer last = (Integer)lastObj;.

Idealmente, tuttavia, si utilizzerà uno TreeSet<Integer> e in seguito si inseriranno semplicemente Integers.

3

Post Java 1.4, è possibile utilizzare autoboxing.

Così diventa,

int start = 1 + (Integer) primes.last(); // the added 1 is just for program logic 

se si è utilizzato farmaci generici con il tuo TreeSet (TreeSet<Integer>) è possibile rimuovere il cast iniziale per intero.

2

Perché non puoi semplicemente lanciarlo, piuttosto che convertirlo in una stringa, quindi analizzare quella stringa e creare un nuovo riferimento?

Object lastObj = primes.last(); 
int start = 1 + ((Integer)lastObj).intValue(); 
4

Se sai che primes contiene solo numeri interi, dovresti fare primes in un TreeSet<Integer>.

Sarebbe poi diventato:

int start = 1 + primes.last().intValue(); 

Se non è possibile utilizzare farmaci generici usano questo:

int start = 1 + ((Integer)prime.last()).intValue(); 

Casting in una stringa sarebbe solo sciocco.

A proposito, non suggerisco di utilizzare l'autoboxing. Fa ogni genere di cose dietro la schiena. Mi sembra più chiaro usare Integer esplicitamente. Ma questa è solo la mia preferenza personale, puoi usare l'autoboxing se vuoi.

+0

Il boxing automatico è integrato nella lingua; non puoi scegliere di non usarlo. Io consiglio esattamente il contrario: non dichiarare mai nulla (variabile, argomento metodo, ecc.) Come Integer se si può usare invece int (e lo stesso vale per gli altri tipi primitivi). Bloch dà lo stesso consiglio in Java 2 efficace. –

+0

@Alan M: Ovviamente si vorrebbe usare int invece di Integer quando possibile, ma suggerirei di rendere esplicita la conversione, in modo da sapere quando lo si sta facendo. – Zifre