2016-08-03 7 views
0

Wenn der Code ausgeführt wird, verursacht die verschachtelte Schleife gelegentliche doppelte Einträge zum System, ich habe eine Weile damit verbracht, dies zu durchschauen, kann aber immer noch nicht finden, was das verursacht, würde ich jede Hilfe schätzen?Verschachtelte Schleife erstellt doppelte Einträge beim Ausführen, Problem nicht gefunden?

for(int i = 0; i < subWorkItemElement.getChildNodes().getLength(); i++) { 
    Boolean test = false; 
    WorkItemCommon existingChild = null; 
    String summary = null; 
    if(subWorkItemElement.getChildNodes().item(i).getNodeName().equals("workitem")) { 
     // We know it's a work item - but is it in the existing list? 
     Element childWorkItem = (Element) subWorkItemElement.getChildNodes().item(i); 
     for(int j = 0; j < subWorkItemElement.getChildNodes().getLength(); j++) { 
      if(childWorkItem.getChildNodes().item(j) instanceof Element) { 
       if(((Element)childWorkItem.getChildNodes().item(j)).getNodeName().equals("details")) { 
        summary = ((Element) childWorkItem.getChildNodes().item(j)).getElementsByTagName("summary") 
          .item(0).getTextContent(); 

        for(String k : userInfoHashMap.keySet()) { 
         summary = summary.replace("${" + k + "}", userInfoHashMap.get(k)); 
        } 

        if(childHashTable.containsKey(summary)) { 
         test = true; 
         existingChild = childHashTable.get(summary); 
         IWorkItem workItem = existingChild.getWorkItem(); 
         System.out.println("INFO: The task with summary \"" + summary + "\" already exists. Skipping creation."); 
         System.out.println("this task is work item: " + workItem.getId()); 
         //either check the tasks in the xml for updated details and then modify the existing workitem 
         //or just modify the work item without checking for updates 
         makeChildTask(childWorkItem, existingChild, childHashTable, userInfoHashMap, workItemHashMap, rtc, false); 

         break; 
        } 
       } 
      } 
     } 

     if(!test) { 
      System.out.println("INFO: The task with summary " + summary + " does not currently exist. Creating."); 
      makeChildTask(childWorkItem, thisItem, childHashTable, userInfoHashMap, workItemHashMap, rtc, true); 
     } else makeFromExistingChildTask(childWorkItem, existingChild, userInfoHashMap, workItemHashMap, rtc); 
    } 
} 
+3

Ich schlage vor, einen Haltepunkt zu setzen und den Code zu folgen. –

+0

Es ist schwer, Ihrem Code zu folgen, ohne zu wissen, was genau er tun soll, und es ist wahrscheinlich zu viel, um es hier zu erklären. Daher würde ich vorschlagen, mit einem Debugger durch den Code zu gehen und selbst einen Blick darauf zu werfen. Außerdem scheinst du zweimal über die Kindknoten zu iterieren und erhältst mindestens O (n^2) -Komplexität. Versuchen Sie das zu beheben, und Sie könnten sogar Ihr Problem beheben (ich nehme an, dass Sie einige Kinder zweimal bearbeiten). – Thomas

Antwort

0

Sie sind möglicherweise (nicht sicher, was makeChildTask() der Fall ist) Ändern einer XML-Struktur, während Sie durch die Liste Kinder laufen. Dies ist zwar nicht unbedingt falsch, kann jedoch dazu führen, dass Sie während der Verarbeitung der Liste Einträge einfügen. Da Sie die subWorkItemElement.getChildNodes().getLength() jedes Mal aufrufen, anstatt sie zu cachen, kann dies dazu führen, dass sich die Länge zwischen den Schleifeniterationen ändert.

+0

Sehr neu in Java, also habe ich noch nie zuvor einen Cache erstellt und bin mir nicht sicher, wie ich anfangen soll, wenn Sie irgendeinen Vorschlag machen könnten, der sehr geschätzt wird. – Skenworthy

+0

In diesem Fall wollte ich mit "cache'ing" nur eine Variable erzeugen, die das Ergebnis enthält, zB: 'int howManyNodes = subWorkItemElement.getChildNodes(). GetLength();' und dann 'for (int j = 0; j < howManyNodes; j ++) {... ' –

+0

ah das ist super danke, ich werde das versuchen und hoffe, es gibt das gewünschte Ergebnis – Skenworthy

Verwandte Themen