2013-07-24 1 views
0

Я нашел странное поведение этого Java-кода. Мне нужно хранить карту с целым числом в качестве ключа (используется для идентификации лица) и список статьи (в основном Java Bean), поэтому я определил его таким образом:Карта списков: столкновение элементов

HashMap<Integer, List<Article>> articles = new HashMap<Integer, List<Article>>(); 

Чтобы заполнить содержимое, Я использую следующие инструкции:

List<Article> topic_articles = new ArrayList<Article>(); 
topic_articles = emFactory.getRelatedArticle(ticket, list_1, true); 
articles.put(15, new ArrayList<Article>(topic_articles)); 
for (Article article : topic_articles) { 
    logger.debug("DEBUG ### " + article.getTitle() + " - " + article.getWeight()); 
} 

topic_articles = new ArrayList<Article>(); 
topic_articles = emFactory.getRelatedArticle(ticket, list_2, true); 
articles.put(18, new ArrayList<Article>(topic_articles)); 
for (Article article : topic_articles) { 
    logger.debug("DEBUG ### " + article.getTitle() + " - " + article.getWeight()); 
} 

выход журнала является:

DEBUG ### How to start eating healthier - 1980 
DEBUG ### Food label claims - 1980 
DEBUG ### The glycemic index and carb confusion - 1980 
DEBUG ### What is Health Check - 1980 
DEBUG ### Why you should keep a food journal - 1980 
DEBUG ### The sweet and lowdown on alternatives to white sugar - 1980 
DEBUG ### An apple a day really can keep the doctor away - 1650 
DEBUG ### Canada's new and improved food guide - 1650 
DEBUG ### Choosing the right cooking oil - 1650 
DEBUG ### How much fibre is in food? - 1650 


DEBUG ### The glycemic index and carb confusion - 768 
DEBUG ### The importance of weight management in diabetes - 768 
DEBUG ### Why fibre is a friend to people with diabetes - 768 
DEBUG ### Healthy recipes - 768 
DEBUG ### Diabetes diet makeover - 768 
DEBUG ### Exercise and your blood sugar - 768 
DEBUG ### Make your favourite recipes diabetes-friendly - 768 
DEBUG ### Why you should keep a food journal - 640 
DEBUG ### Overweight or obese? - 512 
DEBUG ### Diet + exercise = weight loss - 512 

Совершенно верно ... но, когда я вернусь к абоненту карту, и я стараюсь читать внутренние списки, я получаю столкновение по статьям с таким же названием (Гликемический индекс и путаница карбюратора).

for (Map.Entry<Integer, List<Article>> entry : articles.entrySet()) { 

    logger.debug("####### Pipeline : " + entry.getKey()); 
    for (Article article : entry.getValue()) { 
     logger.debug("DEBUG ### " + article.getTitle() + " - " + article.getWeight()); 
    } 

} 

Это выход:

####### List : 1 
DEBUG ### The glycemic index and carb confusion - 768 
DEBUG ### The importance of weight management in diabetes - 768 
DEBUG ### Why fibre is a friend to people with diabetes - 768 
DEBUG ### Healthy recipes - 768 
DEBUG ### Diabetes diet makeover - 768 
DEBUG ### Exercise and your blood sugar - 768 
DEBUG ### Make your favourite recipes diabetes-friendly - 768 
DEBUG ### Why you should keep a food journal - 640 
DEBUG ### Overweight or obese? - 512 
DEBUG ### Diet + exercise = weight loss - 512 
####### List : 2 
DEBUG ### How to start eating healthier - 1980 
DEBUG ### Food label claims - 1980 
DEBUG ### The glycemic index and carb confusion - 768 
DEBUG ### What is Health Check - 1980 
DEBUG ### Why you should keep a food journal - 1980 
DEBUG ### The sweet and lowdown on alternatives to white sugar - 1980 
DEBUG ### An apple a day really can keep the doctor away - 1650 
DEBUG ### Canada's new and improved food guide - 1650 
DEBUG ### Choosing the right cooking oil - 1650 
DEBUG ### How much fibre is in food? - 1650 

Что происходит ???? Похоже, что во второй раз, когда я помещал Список на карту, элемент с тем же названием первого списка переопределяется вторым. В основном позиция правильная, но вес нет. Я использую Java 1.6

Любые подсказки? Это сводит меня с ума ....

благодаря
Andrea

+0

Непонятно, в чем проблема. Что такое «столкновение» в этом случае? – Jokab

+0

В этом случае столкновение происходит в двух списках, элементы «Гликемический индекс и путаница карбюратора - 768» в элементе переопределения списка 2 «Гликемический индекс и путаница карбюратора - 1980» в списке 1. Не уверен, что «столкновение» является правильным срок .... –

+0

Что делает 'emFactory.getRelatedArticle'? Что такое 'билет',' list_1' и 'list_2'? – andy256

ответ

0

Таким образом, проблема, как представляется, что вес статьи с названием «Гликемический индекс и карбюратор путаница» в изменениях list_1 иметь такое же значение, как эквивалентную статью в списке_2 после создания списка_2. Вы уверены, что вызов emFactory.getRelatedArticle(ticket, list_2, true); возвращает другой объект, когда он находит статью с тем же заголовком? Ясно, что вы ожидаете/предполагаете это, но подтвердили ли вы, что это на самом деле происходит?

Вы можете проверить это, изменив код, чтобы сделать то же самое, но в другом порядке, сначала создав оба списка, а затем выведя их оба. Если выход изменяется только путем переупорядочения линий, тогда у вас есть дымящийся пистолет.

List<Article> topic_articles1 = emFactory.getRelatedArticle(ticket, list_1, true); 
articles.put(15, new ArrayList<Article>(topic_articles1)); 
List<Article> topic_articles2 = emFactory.getRelatedArticle(ticket, list_2, true); 
articles.put(18, new ArrayList<Article>(topic_articles2)); 

for (Article article : topic_articles1) { 
    logger.debug("DEBUG ### " + article.getTitle() + " - " + article.getWeight()); 
} 
for (Article article : topic_articles2) { 
    logger.debug("DEBUG ### " + article.getTitle() + " - " + article.getWeight()); 
}