2009-05-20 2 views
7

У меня есть TreeSet, который будет полон целых чисел. Короче говоря, я пытаюсь запустить цикл после последнего (наибольшего) значения, хранящегося в списке. Что я делаю сейчас, чтобы получить начальную переменную является: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 могут быть объявлены как содержащие только объекты Integer

TreeSet<Integer> primes; 

Теперь, чтобы получить объект из набора можно

Integer last = primes.last(); 

и с помощью функции Autoboxing вы получите

int start = 1 + last; 
+6

вы могли бы просто сделать, int start = 1 + primes.last(); –

+1

Это будет еще меньше кода для написания ... но для иллюстрации улучшения дженериков и улучшений автобоксинга лучше оставить их в качестве отдельных операторов для этого ответа –

+0

Да, я вижу, откуда вы. Только что опубликовал мой комментарий в виде сноски. –

8

В J2SE 5 или более поздних версиях это происходит автоматически, с функцией «autoboxing».

int start = 1 + last; 

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

Кроме того, если вы знаете, что все они собираются быть объектами Integer, используйте параметризированный тип:

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

Затем объединить его с помощью функции Autoboxing:

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

Мое единственное возражение против автобоксинга - это ситуации, когда вы «работаете» с ints, поэтому вы выполняете сравнение ==, которое является сравнительным сравнением, а не сравнение ожидаемых значений. –

+0

Ryan, я подумал, что если вы попытались использовать int == Integer, то Integer будет автобокс в int и Java сравнит два примитива. –

+0

Как верно. Каждый раз, когда вы полагаетесь на что-то, что происходит автоматически, вы добавляете еще один слой мысли, который должен происходить в затылке. Созданные с помощью C++ конструкторы! – jbm

4

Если вы знаете, что они были «int», когда они были введены, тогда они были tr ansformed to Integer, в то время как в коллекции (коллекции не могут содержать примитивы, только объекты), как таковые, вы можете просто Integer last = (Integer)lastObj;.

В идеале, однако, вы бы использовали TreeSet<Integer>, а затем он просто подпитывал бы вас Целые числа.

3

Post Java 1.4, вы можете использовать autoboxing.

Так он становится,

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

Если вы использовали генерики с вашим TreeSet (TreeSet<Integer>), вы можете удалить первоначальный оттенок Integer.

2

Почему вы не можете просто использовать его, а не преобразовывать в строку, а затем разбирать эту строку и создавать новую ссылку?

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

Если вы знаете, что primes держит только целые числа, вы должны сделать primes в TreeSet<Integer>.

Он бы тогда:

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

Если вы не можете использовать дженерики использовать это:

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

Кастинг в строку будет просто глупо.

Кстати, я не предлагаю использовать автобоксинг. Он делает все за вашей спиной. Явно с использованием Integer кажется яснее. Но это только мои личные предпочтения, вы можете использовать автобоксинг, если хотите.

+0

Autoboxing встроен в язык; вы не можете выбрать, чтобы не использовать его. Я советую прямо противоположное: никогда не объявляйте ничего (переменная, аргумент метода и т. Д.) Как Integer, если вы можете использовать int вместо (nd то же самое относится к другим примитивным типам). Bloch дает тот же совет в Effective Java 2ed. –

+0

@Alan M: Очевидно, вы хотели бы использовать int вместо Integer, если это возможно, но я предлагаю всегда сделать преобразование явным, поэтому вы знаете, когда вы это делаете. – Zifre

Смежные вопросы