그림 : 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 : 필자는 필요한 것을 더 명확하게 이해하기 위해 질문에 대한 자세한 내용과 코드를 추가했습니다.
'a'와 'b'값은 링크를 생성하는 지점까지 'QStrings'로 처리됩니다. 이 경우 코드를 어떻게 적용 하시겠습니까? – Joum
또한 노드 이름은 예제입니다. 그들은 어떤 식 으로든 직렬화되지 않습니다. 그것들은'Bread'와'Butter'와 같은 것이 될 수 있습니다 ... – Joum
'QString :: compare'를 사용하여 문자열을 비교할 수 있습니다. –