java - 确定通过元素的路径
问题描述
我有一个类 Item,它使用一个字符作为标识符。
public class Item {
private char identifier;
private Set<Character> predecessors;
private Set<Character> successors;
// Constructor, getters and setters...
}
我希望能够检索由Path
类表示的路径,其中包含一个简单的有序列表Item
:
public class Path {
private List<Item> items;
// Constructor, getters and setters
}
为了存储和管理我的项目和路径,我使用了一个专门的类。它包含两个Set
包含这些类型中的每一个。我可以使用其标识符检索任务。
public class SimpleClass {
private Set<Item> items;
private Set<Path> paths;
// Constructor, getters and setters
public Optional<Item> getItemById(char identifier) {
/// ....
}
}
我想创建一个方法来返回一个Set
包含每个Path
但我做不到的方法。欢迎提供一点帮助。一个小例子来说明我的观点:
- D 和 E 是 G 的前件
- G 是 D 和 E 的继任者
- A、B、D、G、J、K 是一条路径
- A、C、F、H、J、K 是一条路径
更新/注意:我正在寻找通过一组项目构建路径
解决方案
一种快速而肮脏的递归算法。我只是创建了第一个地图来加快项目检索。看看它是否有效,尝试理解它并改变它。
/**
* Build all paths
*/
public void buildPaths() {
Map<Character,Item> itemsByID=new HashMap<>();
for (Item i:items) {
itemsByID.put(i.getIdentifier(), i);
}
List<Item> starts=items.stream().filter(i->i.getPredecessors().isEmpty()).collect(Collectors.toList());
for (Item st:starts) {
Path p=new Path();
p.getItems().add(st);
buildPath(p,itemsByID);
}
}
/**
* Build the next step of the given path
* @param p
* @param itemsByID
*/
private void buildPath(Path p,Map<Character,Item> itemsByID) {
Item last=p.getItems().get(p.getItems().size()-1);
Set<Character> successors=last.getSuccessors();
// no successor, path is finished, add to collection
if (successors.isEmpty()) {
paths.add(p);
// one successor continue on same path
} else if (successors.size()==1){
p.getItems().add(itemsByID.get(successors.iterator().next()));
buildPath(p,itemsByID);
} else {
// multiple successors, create a new path for each branch
for (Character c:successors) {
Path p1=new Path();
p1.getItems().addAll(p.getItems());
p1.getItems().add(itemsByID.get(c));
buildPath(p1, itemsByID);
}
}
}
推荐阅读
- php - 如何在 url 中放置变量并使用 php header 提交表单
- xml - 使用 VBA 或 VB6 从 url (https) 下载 xml 文件
- c# - 为什么编译器不允许将 Class.System.Type 作为 T 参数传递给泛型方法
- python - Odoo 10:如何从 many2one 字段的下拉列表中删除随机值?
- jquery - jquery 可调整大小的栏,它响应窗口大小
- opencv - 为什么在 PyTorch 安装中 USE_OPENCV 处于关闭状态?
- javascript - 使用 tampermonkey 在按键上提取跨度值
- outlook - 如何通过 EWS 列出公用文件夹邮箱?
- c# - HttpWebRequest.GetResponse 方法卡住特定的 url
- comparison - 如何在 1 或 2 个字典中查找字谜?