2016-03-26 6 views
-4

Я не знаю, как искать это:Java Список_массивов и карта

Random generator = new Random(); 
Map<Integer, ArrayList> mapOfprevOp = new HashMap<>(); 
ArrayList<Integer> listPrev = new ArrayList<>(); 


listPrev = mapOfprevOp.get(operacja); 
System.out.println(listPrev); // it will show [] 

int rnd = generator.nextInt(op_cnt) + 1; 
listPrev.add(rnd); 
System.out.println(mapOfprevOp.get(operacja)); // it will show value of listPrev 

Почему второй System.out печати меня на значении экрана listPrev?

Не следует печатать []?

listPrev = mapOfprevOp.get(operacja); 

Эта линия работает не так, как я мог ожидать?

+0

На карте будут отображаться значения, которые вы добавили в список, потому что это тот же объект. –

+0

Итак, как назначить значение Map в ArrayList? – marylyn17

+0

Как я могу отделить его? – marylyn17

ответ

0

Это предполагает, что при первом вызове System.out.println список пуст.

Если вы посмотрите здесь https://docs.oracle.com/javase/7/docs/api/java/util/AbstractCollection.html#toString%28%29. Мы видим, что метод toString для списка возвращает элементы между квадратными скобками. Таким образом, [] - пустой список.

Во втором звонке вы добавили элемент, поэтому вы его видите. Вам нужно иметь в виду, что в Java мы передаем объекты по ссылке, что означает, что ваш listPrev ссылается на тот же список, что и на карте.

Если вы хотите просто получить значение, то я хотел бы предложить вам изменить

listPrev = mapOfprevOp.get(operacja); 

быть

listPrev.addAll(mapOfprevOp.get(operacja)); 

Это добавит все элементы из mapOfprevOp.get(operacja) в listPrev без последующих операций, влияющих на карта, которая, кажется, нужна вам.

Кроме того, Map<Integer, ArrayList> mapOfprevOp = new HashMap<>(); Как правило, лучше использовать типы интерфейсов в дельцах, например, у вас есть с Картой. Поэтому я бы подумал о переключении ArrayList на List.

Объект, который вы используете его себе по-прежнему может быть ArrayList, как это:

Карта mapOfprevOp = новый HashMap <>(); Список listPrev = новый ArrayList <>();

Это означает, что если вы хотите изменить его как LinkedList, вы можете изменить его только в одном месте, а не в 3. Обратите внимание, что за исключением списков Arrays.asList все списки могут быть изменены.

+0

Должно быть, ArrayList, потому что я добавлю туда больше элементов. Вот только фрагмент кода – marylyn17

+0

Отредактированный ответ, чтобы объяснить больше - так как я думаю, вы неправильно поняли этот момент. – saml

+0

Мне просто нужно получить значение mapOfprevOp.get (operacja), не назначая ему listPrev. – marylyn17

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