0

想象一下:我有一个 JSON 文件,其中包含一个包含类型列表的Node对象列表。Link就像是:

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具有返回指向 source/destination 的指针的 getter 方法Node。在该文件中,有关链接的信息存储为具有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列表中的重复项(显然)。关于如何实现这一目标的任何想法?

注意:我知道上面的伪 JSON 无效,只是为了让您了解结构。

NOTE2:我重新措辞并在问题中添加了细节和代码,以便更清楚地理解我需要什么。

4

2 回答 2

1

1.规范化链接,即替换(a, b)(b, a)when b < a。每个链接应表示为(a, b), a < b

2.创建一个QSet< QPair<Node*, Node *> >变量并将所有链接放入其中。每个链接对象都可以使用qMakePair(node1, node2). 由于QSet是一个 qnique 容器,所有重复项将被自动删除。

于 2013-07-29T16:05:07.053 回答
0

好吧,我没有完全按照@Riateche 的建议做同样的事情,但类似的事情。

我基本上创建了一个QList<QPair<QString,QString> >,这样我就可以轻松地检查重复项,然后我Link根据列表中的项目创建了一个QPair列表。就像是:

        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 了他的回答。

于 2013-07-30T11:40:06.120 回答