2009-05-20 5 views
7

私は整数でいっぱいになるTreeSetを持っています。ストーリーを短くするために、リストに格納されている最後の(最大の)値の後にループを開始しようとしています。私は始まる変数を取得するために、今やっていることです:私はint型に(私は常にint型になります)知っているオブジェクトをキャストするためのより良い方法がなければならないことを確信しているJavaオブジェクトからint:より良い方法ですか?

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

「スタート'誰でもこれを行うためのより良い方法を知っていますか?

答えて

8

Javaバージョン1.6を使用していますか?その場合、オートボクシングとジェネリックスを利用してコードをクリーンアップすることができます。

まず、TreeSetのが唯一の整数

TreeSet<Integer> primes; 

はあなたが

Integer last = primes.last(); 

とオートボクシング機能を使用してあなたが

を得ることができますセットからオブジェクトを取得するオブジェクトを含むように宣言することができます
int start = 1 + last; 
+6

あなたはちょうど、int start = 1 + primes.last(); –

+1

これはコードを書くのがより少なくなるでしょう...しかし、ジェネリックの改善とオートボクシングの改善を説明するために、この答えのための別個のステートメントとしてそれらを残すことが最善です –

+0

ええ、あなたはどこから来ているのか分かります。私のコメントを脚注として投稿しました。 –

8

J2SE 5以降では、「オートボクシング」機能を使用して自動的に行われます。

int start = 1 + last; 

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

あなたが知っている場合にも、それらはすべてパラメータ化された型を使用して、Integerオブジェクトであることを行っている:

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

そして、オートボクシング機能とそれを組み合わせる:

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

私がautoboxingを唯一反対するのは、あなたがintで作業しているように見える状況です。そのため、期待値比較ではなく、比較比較である==比較を行います。 –

+0

Ryan、int == Integerを試してみたらIntegerがintにオートボックスし、Javaが2つのプリミティブを比較すると思いました。 –

+0

本当です。自動的に起こっていることに頼るたびに、あなたの頭の後ろに起きる必要がある別の考え方を追加します。 C++自動生成コンストラクタ! – jbm

4

あなたがそれらが入れられたときに「int」であったことを知っていれば、それはtr Collection(コレクションにはプリミティブ、オブジェクトのみを含めることはできません)の間に整数に変換されるため、単純にInteger last = (Integer)lastObj;とすることができます。

しかし、理想的にはTreeSet<Integer>を使用すると、最初に整数を供給することになります。

3

投稿Java 1.4、autoboxingを使用できます。

だから、それはあなたがあなたのTreeSetを(TreeSet<Integer>)とジェネリック医薬品を使用する場合は、整数への最初のキャストを取り除くことができ、

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

になります。

2

文字列に変換し、その文字列を解析して新しい参照を作成するのではなく、なぜそれをキャストできませんか?

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

primesが整数を保持していることが分かっている場合は、 primesTreeSet<Integer>に変換します。

その後になる:

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

あなたがジェネリックを使用することができない場合は、これを使用します。文字列にキャスト

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

はちょうど愚かなことでしょう。

ところで、私はオートボクシングの使用を勧めません。それはあなたの背後にあるすべての種類のことを行います。明示的にIntegerを使用して私には明らかです。しかし、これは私の個人的な好みに過ぎません。必要に応じてオートボクシングを使うことができます。

+0

オートボクシングは言語に組み込まれています。それを使用しないことを選択することはできません。逆をお勧めします。intを代わりに使うことができれば(変数、メソッドの引数など)何も宣言しないでください(他のプリミティブ型についても同様です)。 Blochは、Effective Java 2edでも同じアドバイスをしています。 –

+0

@Alan M:可能であれば、Integerの代わりにintを使用したいと思いますが、変換を明示的にすることをお勧めします。 – Zifre

関連する問題