2013-07-29 1 views
0

그림 : Node의 목록이있는 Link 유형의 목록이있는 JSON 파일이 있습니다. 같은 : 내가 링크의 고유 한 쌍을 식별해야Qt - 까다로운 검색 알고리즘 - 목록에 중복 또는 "미러링"된 중복

node1: 
    links: node1,node2 
      node3,node1 
      node1,node6 

node2: 
    links: node2,node1 
      node2,node9 
      node7,node2 

- 한 (node_a,node_b) 쌍 즉. (node_b,node_a)같은 것을으로 나타냅니다.

Link 클래스에는 소스/대상 Node에 대한 포인터를 반환하는 getter 메서드가 있습니다. 파일에서 링크에 대한 정보는 source 노드 이름과 destination 노드 이름 (예 : (source,destination))이있는 문자열로 저장됩니다.

파일에서 구조를 만들 때 먼저 Nodes을 만들고 나서 Links을 만듭니다. 다음과 같이 Link 생성자는 다음과 같습니다

Link::Link(Node *fromNode, Node *toNode) 

그리고 내 코드는 링크를 만들 :

 QList<Link*> consumedLinks; // list where I was trying to place all the non-duplicate links 

     // for each node in the file 
     foreach(QVariant nodesMap, allNodesList){ 
      QVariantMap node1 = nodesMap.toMap(); 
      QList<QVariant> nodeDetails = node1["node"].toList(); 
      QVariantMap allLinksMap = nodeDetails.at(9).toMap(); 

      // extract all the links of the node to a list of QVariant 
      QList<QVariant> linksList = allLinksMap["links"].toList(); 

      // for each Link in that list 
      foreach(QVariant linkMap, linksList){ 
       QVariantMap details = linkMap.toMap(); 
       Node *savedFromNode; 
       Node *savedToNode; 

       // get all the Items in the scene 
       QList<QGraphicsItem*> itemList = scene->items(); 

       // cast each item to a Node 
       foreach(QGraphicsItem *item, itemList){ 
        Node* tempNode = qgraphicsitem_cast<Node*>(item); 
        if(tempNode){ 
         // check what the node name matches in the link list 
         if(tempNode->text()==details["fromNode"]){ 
          savedFromNode = tempNode; 
         } 
         if(tempNode->text()==details["toNode"]){ 
          savedToNode = tempNode; 
         } 
        } 
       } 

       // create the link 
       Link *linkToCheck = new Link(savedFromNode,savedToNode); 

       // add it to the links list (even if duplicate) 
       consumedLinks.append(linkToCheck); 
      } 
     } 

     // add all the links as graphics items in the scene 
     foreach(Link *linkToCheck, consumedLinks){ 
      scene->addItem(linkToCheck); 
     } 

그래서 지금 이것은 consumedLinks 목록 (명백하게)에서 중복을 확인하지 않습니다. 이것을 달성하는 방법에 대한 아이디어가 있습니까?

참고 : 위의 pseudo-JSON이 유효하지 않은 것으로 알고 있습니다., 구조체에 대한 아이디어 만 제공하는 것입니다.

참고 2 : 필자는 필요한 것을 더 명확하게 이해하기 위해 질문에 대한 자세한 내용과 코드를 추가했습니다.

답변

0

글쎄, @Riateche가 제시 한 것과 똑같은 것은 아니지만 비슷한 점이 있습니다.

나는 기본적으로 QList<QPair<QString,QString> >을 만들었으므로 중복을 쉽게 확인할 수 있었고 QPair 목록의 항목을 기준으로 Link 목록을 만들었습니다. 뭔가 같이 : 그것은 내가 해결하는 데 필요한 것을 해결하기 때문에

 QList<Node*> existingNodes; 
     QList<QPair<QString,QString> > linkPairList; 
     QList<QGraphicsItem*> itemList = scene->items(); 

     foreach(QGraphicsItem *item, itemList){ 
      Node* tempNode = qgraphicsitem_cast<Node*>(item); 
      if(tempNode){ 
       existingNodes.append(tempNode); 
      } 
     } 

     foreach(QVariant nodesMap, allNodesList){ 
      QVariantMap node1 = nodesMap.toMap(); 
      QList<QVariant> nodeDetails = node1["node"].toList(); 
      QVariantMap allLinksMap = nodeDetails.at(9).toMap(); 


      QList<QVariant> linksList = allLinksMap["links"].toList(); 
      foreach(QVariant linkMap, linksList){ 
       QVariantMap details = linkMap.toMap(); 

       QPair<QString,QString>linkPair(details["fromNode"].toString(),details["toNode"].toString()); 
       QPair<QString,QString>reversedLinkPair(details["toNode"].toString(),details["fromNode"].toString()); 

       if(!linkPairList.contains(linkPair)){ 
        // !dupe 
        if(!linkPairList.contains(reversedLinkPair)){ 
         // !reversed dupe 
         linkPairList.append(linkPair); 
        } 
       } 
       qDebug()<<"number of pairs: "<<linkPairList.size(); 
      } 

     } 
     QPair<QString,QString> linkPairInList; 
     foreach(linkPairInList, linkPairList){ 
      Node *savedFromNode; 
      Node *savedToNode; 
      foreach(Node* node, existingNodes){ 
       if(node->text()==linkPairInList.first){ 
        savedFromNode=node; 
       } 
       if(node->text()==linkPairInList.second){ 
        savedToNode=node; 
       } 
      } 
      Link *newLink = new Link(savedFromNode,savedToNode, "input"); 
      scene->addItem(newLink); 
     } 

이것은 올바른 대답이다. @ Riateche의 의견으로 인해서 만 거기에 도착 했으므로 그의 대답을 +1했습니다.

1

1.b < a 일 때 (a, b)에서 (b, a)으로 바꿉니다. 각 링크는 (a, b), a < b으로 표시되어야합니다.

2.QSet< QPair<Node*, Node *> > 변수를 만들고 모든 링크를 변수에 넣습니다. 각 링크 객체는 qMakePair(node1, node2)을 사용하여 만들 수 있습니다. QSet은 qnique 컨테이너이므로 모든 중복 항목은 자동으로 제거됩니다.

+0

'a'와 'b'값은 링크를 생성하는 지점까지 'QStrings'로 처리됩니다. 이 경우 코드를 어떻게 적용 하시겠습니까? – Joum

+0

또한 노드 이름은 예제입니다. 그들은 어떤 식 으로든 직렬화되지 않습니다. 그것들은'Bread'와'Butter'와 같은 것이 될 수 있습니다 ... – Joum

+1

'QString :: compare'를 사용하여 문자열을 비교할 수 있습니다. –