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:必要なものをより明確に理解できるように、質問に詳細とコードを言い換えて追加しました。