0

Nodeこれを想像してください: タイプのリストを含むオブジェクトのリストを含む JSON ファイルがあり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 が無効であることはわかっています。これは、構造を理解するためのものです。

注2:必要なものをより明確に理解できるように、質問に詳細とコードを言い換えて追加しました。

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は特殊なコンテナーであるため、すべての重複は自動的に削除されます。

于 2013-07-29T16:05:07.053 に答える
0

まあ、@Riatcheが提案したのとまったく同じことはしませんでしたが、似たようなことをしました。

基本的に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 に答える