我正在搜索我拥有的某些类别和子类别的实现/数据结构。我想使用搜索树但不知道如何开始实现。
让我告诉你数据的样子。它从后端开始作为json结构出现在我身上,但它看起来像这样:
[
{
"id": 94,
"category_name": "New In", //this is the category category_name
"description": "",
"children": [ //this is the category children which can also be a sub-category
{
"id": 322,
"category_name": "New Studio",
"description": "Chic, sophisticated and polished with a classic edge."
},
{
"id": 365,
"category_name": "New Soho",
"description": "Fresh, eclectic, and trendy. Oozes effortless cool."
},
{
"id": 809,
"category_name": "Summer Collection",
"description": "Your ultimate summer look"
}
]
},
{
"id": 12,
"category_name": "Clothes",
"description": "",
"children": [
{
"id": 22,
"category_name": "All Clothes",
"description": ""
},
{
"id": 63,
"category_name": "Tops",
"description": "",
"children": [
{
"id": 5,
"category_name": "All Tops",
"description": ""
}
]
},
{
"id": 641,
"category_name": "Accessories",
"description": "",
"children": [
{
"id": 61,
"category_name": "All Accessories",
"description": ""
},
{
"id": 622,
"category_name": "Jewelry",
"description": "",
"children": [ // here is an example of a child that is a sub-category also
{
"id": 52,
"category_name": "All Jewelry",
"description": ""
},
{
"id": 68,
"name": "Necklaces",
"description": ""
},
{
"id": 69,
"name": "Bracelets",
"description": ""
},
]
},
]
所以,如果我不得不把它画出来,它会看起来像这样:
所以我希望能够获得任何东西。所以,例如,如果我想搜索项链,那么我想要一条项链来获得路径:分类/配件/珠宝/项链
这是否有内置的数据结构?我在java编码。我想我也需要以某种顺序排序的节点,也许是A-Z。
到目前为止,我有这个:class Node{
String label;
List<Node> children;
}
但是如何搜索?并且有更好的数据结构吗?我不想在搜索过程中迭代所有节点,有没有办法对树进行排序,所以我不必这样做?我现在如何拥有它我必须遍历所有的孩子。是否有一种方法可以按字母顺序排序,或者某种排序可以使查找更快?
答案 0 :(得分:2)
到目前为止,我还不知道任何Java内置数据结构可以处理您正在寻找的内容。 stackoverflow上有一些tree implementations on github或此thread可以帮助您。 但如果我理解你,你也有兴趣在你的树上进行一次表现良好的搜索。 对树进行排序并不能完全解决这个问题,因为您仍然需要搜索每个子树。虽然它可以显着提高搜索性能。但据我所知,Java中没有开箱即用的数据结构。
我想到的另一种方法是使用包含label
的地图和对Node
的引用。但是,您需要一个树,您可以从树叶到根节点获取完整路径,您必须处理重复的信息。例如。如果删除节点,则还必须在地图中删除它。如果您还想从根遍历树,则可以构建双向树。
这就是我的方法的样子:
class Node {
String label;
Node parent;
}
class Tree {
HashMap<String, List<Node>> tree;
}
如果您有多次相同的标签名称,则为List<Node>
。例如。如果您necklaces
和jewlery
summer collection
答案 1 :(得分:2)
你需要两件事:
在Node对象中,也可以引用父节点:
class Node{
String label;
List<Node> children;
Node parent;
}
创建一个将标签映射到节点的HashMap:
HashMap<String, Node> labelsToNodes;
然后使用HashMap中的get()方法进行搜索。您可以通过重复获取父节点来获取类别列表。如果你想要这个代码,请告诉我,我会添加它(我现在很短时间)。
答案 2 :(得分:1)
本学期我有一个项目用于搜索树木。我使用了不同类型的算法。例如,BFS或DFS取决于您想要的内容以及您希望如何在树中的节点上移动。但是,我更喜欢 IDS (迭代加深深度优先搜索)。要使用此算法,您可以访问此链接。
最好是让父亲而不是孩子,因为它会更好地工作,你不会失去记忆 clip in Youtube to show IDS
class State{
String name;
State father;
}