2012-07-05 4 views
0
NodeList nList2 = doc.getElementsByTagName("dep"); 
Map<String, List<Map<String, String>>> depMap = new HashMap<String, List<Map<String, String>>>(); 
for (int temp = 0; temp < nList2.getLength(); temp++) { 
    Element el = (Element)nList2.item(temp); 
    String type=el.getAttribute("type"); 
    Node nNode = nList2.item(temp); 
    if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
    Element eElement = (Element) nNode; 
    List<Map<String,String>> depList = new ArrayList<Map<String,String>>(); 
    String governor = getTagValue("governor", eElement); 
    String dependent = getTagValue("dependent", eElement); 
    Map<String, String> govdepmap = new HashMap<String, String>(); 
    govdepmap.put(governor, dependent); 
    depList.add(govdepmap); 
    List<Map<String,String>> flist = new ArrayList<Map<String,String>>(); 
    flist.add(govdepmap); 
    depMap.put(type, flist); 
    } 
} 

Я написал этот код, но проблема в том, что всякий раз, когда цикл запускает его, он заменяет список, который уже был сохранен в depMap. Я хочу, чтобы он добавил новую карту в список, полученный из depMap, и не заменил ее.Карты и списки в Java

+0

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

ответ

3

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

Изменить

List<Map<String,String>> flist = new ArrayList<Map<String,String>>(); 

в

List<Map<String,String>> flist = depMap.get(type); 
if(flist == null){ 
List<Map<String,String>> flist = new ArrayList<Map<String,String>>(); 
} 
+0

{neg = [{going = not}, {going = not}, {going = not}], det = [{car = a}, {pencil = a}, {car = a}, {pencil = a} , {car = a}, {pencil = a}], conj = [{going = purchase}], xcomp = [{going = buy}, {going = buy}, {going = buy}], nsubj = [{ = {} = {} = {} = {} = {} = {} = {} = {} = , {buy = am}, {going = am}, {buy = to}, {purchase = am}, {going = am}, {buy = to}, {purchase = am}], dobj = [{buy = car}, {purchase = pencil}, {buy = car}, {purchase = pencil}, {buy = car}, {purchase = pencil}], conj_but = [{going = purchase}, {going = purchase}], cc = [{going = but}]} дает этот результат, но это неправильно, поскольку они добавляются много раз. – agarwav

+0

Hey Jigar Этот код был прав, но вы видите проблему здесь, он выполняет задачу три раза для каждого списка. – agarwav

+0

_it выполняет задачу три раза для каждого списка. _ Уточните, пожалуйста, –

0

Переместить инициализацию от flist, govdepmap и depList вне цикла for.

+0

Все еще не работает. дает неправильный результат – agarwav

+0

Проблема заключается в том, что flist, который извлекается из depMap, добавляется каждый раз, когда он запускается. Я хочу, чтобы новый старый flist был заменен списком, который включает в себя элементы flist retrived + new elements и помещает это в depMap – agarwav

0

Просто измените свой код на следующий код.

NodeList nList2 = doc.getElementsByTagName("dep"); 
    Map<String, List<Map<String, String>>> depMap = new HashMap<String, List<Map<String, String>>>(); 
    List<Map<String,String>> flist = null; 
    for (int temp = 0; temp < nList2.getLength(); temp++) { 
     Element el = (Element)nList2.item(temp); 
     String type=el.getAttribute("type"); 
     Node nNode = nList2.item(temp); 
     if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
     Element eElement = (Element) nNode; 
     List<Map<String,String>> depList = new ArrayList<Map<String,String>>(); 
     String governor = getTagValue("governor", eElement); 
     String dependent = getTagValue("dependent", eElement); 
     Map<String, String> govdepmap = new HashMap<String, String>(); 
     govdepmap.put(governor, dependent); 
     depList.add(govdepmap); 
     if(flist == null){ 
      flist = new ArrayList<Map<String,String>>(); 
     } 
     flist.add(govdepmap); 
     depMap.put(type, depList); 
     } 
    } 
+0

. Это ставит тот же список во всех ключах depMap. – agarwav

+0

@blackpearl Я редактировал код. –

+0

Я проверил, но он снова заменяет старый список. Кстати, где вы извлекаете старый список в этом коде? – agarwav