Как правильно изменить Integer в векторе в Java (j2me) - PullRequest
0 голосов
/ 26 августа 2009

В продолжение моего вопроса о j2me динамических массивах ,

Я сейчас пытаюсь найти способ изменить значения целых чисел в моем векторе.

Скажем, у меня есть Vector v, Array arr и целые числа x, y и i;

В C ++ я мог бы сделать:

v[arr[x][y]] += i;

В j2me я нашел лучший способ сделать то же самое:

v.setElementAt(new Integer(((Integer)(v.elementAt(arr[x][y]))).intValue()+i), arr[x][y]);

Это действительно лучший способ сделать это j2me?

Если это так, что здесь пошло не так? Предполагается, что Java заставляет меня «делать меньше работы» и «делать что-то для меня», но я снова и снова выполняю за это дополнительную работу. Что-то не так со мной, или это какая-то проблема с Java?

Редактировать: я использую J2me SDK 3.0 , который выглядит так, как будто это Java 1.3, так что никаких необычных обобщений, автоматического бокса и всего такого.

Ответы [ 6 ]

4 голосов
/ 26 августа 2009

Боюсь, что так во мне, хотя я бы разделил его, чтобы избежать этого волосатого вкладыша:

Integer val = (Integer)v.elementAt(arr[x][y]);
int newVal = val.intValue() + i;
v.setElementAt(new Integer(newVal), arr[x][y]);

Материал стал намного лучше с автобоксом и дженериками, но они пришли в Java 5, и J2ME - это в основном раздетая версия Java 1.3, если я не был дезинформирован. Вот как это выглядит в Java 5 +:

v.setElementAt(arr[x][y], v.get(arr[x][y]) + i);

Все еще более многословно, чем C ++, но по крайней мере без приведения. Я понимаю, что было нежелание добавлять дженерики и тому подобное в Java, поскольку обычному программисту было бы «слишком сложно» понять [Требуется цитата] . И в итоге мы получили нечитаемый код, пока .Net не получил дженерики и Sun не запрыгнула на подножку.

В любом случае, я согласен, что структуру коллекций было непросто использовать перед генериками / боксами, но я надеюсь, что по крайней мере вам понравится не отлаживать сломанные указатели и поврежденную память.

1 голос
/ 26 августа 2009

У вас есть две вещи, которые сговорились, чтобы взломать код: отсутствие типизированной безопасной коллекции и неизменяемая int-обертка.

Одним из решений было бы использование безопасных коллекций. GNU Trove имеет TIntArrayList для этого:

v.set(arr[x][y], v.get(arr[x][y]) + i);

В качестве альтернативы вы можете использовать изменяемый класс, такой как org.jboss.util.MuInteger:

((MuInteger)v.elementAt(arr[x][y])).add(i);

Или, как грязный хак, массивы длины 1:

((int[])v.elementAt(arr[x][y]))[0] += i;

Если вы можете комбинировать и то, и другое (определенно потребуется написать собственный класс коллекции при отсутствии универсальных элементов):

v.get(arr[x][y]).add(i);
1 голос
/ 26 августа 2009

В Java SE произошли некоторые изменения в языке (Generics), которые сделали бы этот код немного проще, для меня, я думаю, вам не повезло.

Я бы предложил предлагаемое решение по созданию собственного класса, который обертывает простой массив (и выделяет больший, когда это необходимо), который был дан как ответ на ваш предыдущий вопрос.

0 голосов
/ 26 августа 2009

Я не вижу причины, почему вы не сделали бы это так же, как в C ++. Хорошо, вам нужно реализовать динамически масштабируемый контейнер массива самостоятельно, но если вы это сделаете, вы избавитесь от проблемы Integer, когда Java фактически создает new Object of type Integer вместо int примитивного типа.

В вашем исходном вопросе есть хороший пример массива динамических примитивных типов int в качестве ответа, проверьте его еще раз.

0 голосов
/ 26 августа 2009

РЕДАКТИРОВАТЬ: отвечая на этот вопрос, я не знал, что J2ME не поддерживает Generics. Спасибо ТАК за то, что научили меня: -)

РЕДАКТИРОВАТЬ 2: Мое решение неправильно , так как J2ME не поддерживает Generics.

Если вы использовали Generics (JDK 1.5 и выше), вы можете сделать это проще!

Если я предполагаю, что декларация будет такой,

Vector<Integer> v = new Vector<Integer>();

1012 * тогда *

v.setElementAt(new Integer(((Integer)(v.elementAt(arr[x][y]))).intValue()+i), arr[x][y]);

становится

v.setElementAt(new Integer(v.elementAt(arr[x][y]).intValue()+i), arr[x][y]);
0 голосов
/ 26 августа 2009
Vector<Integer> v = new Vector<Integer>(); 
v.setElementAt( arr[x][y], arr[x][y] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...