有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

表示包安装和系统依赖关系的java最佳数据结构

我正在尝试创建一个基于访谈过程的程序(我选择Java,但可以是C/C++或GoLang),以表示/模拟包安装和系统依赖性,如Linux/Unix环境中存在的依赖性。 基本上,我将执行以下要求:

1)保存已安装软件包及其依赖项的记录
2) 支持响应命令显式安装包(除非已安装)
3) 如果需要安装另一个软件包,则支持隐式安装该软件包
4) 支持响应命令显式删除包(如果不需要它来支持其他包)
5) 如果不再需要包来支持其他组件,则支持隐式删除包

安装软件包之前,请自动安装所需的所有软件包。 在移除软件包之前,请确认没有其他软件包需要它。必须先手动删除从属包,然后才能删除该包

我想知道我可以使用的最佳数据结构(以及我可以检查的链接)的提示。我尝试使用队列列表来存储依赖项,使用队列来存储已安装的软件包,但我不确定这是否是最好的方法,如:

... ArrayList<Queue<String>> dependencies = new ArrayList<>(capacity); Queue<String> pkgInstalled = new LinkedList<String>(); ...

该过程将从用户处捕获条目数据,直到发出END命令。 命令语法是:

依赖项1项目2项目(n):包项目1依赖于包项目2(和项目3或任何

安装item1:安装item1和item1所需的任何其他软件包

删除项1:删除项1,如果可能,删除项1所需的包

列表:列出当前安装的所有软件包的名称

结束:在一行中单独使用时,标记输入的结束

1)按照每个响应的安装或拆卸线路,采取相应的措施,确保措施的顺序正确
2) 对于LIST命令,显示当前安装的组件的名称
3) 对于DEPEND和END命令,除了echo之外,不生成任何输出
4) 对于DEPEND命令,每个项只有一个依赖项列表


共 (1) 个答案

  1. # 1 楼答案

    我不知道在这个练习中Queue(或LinkedList)的值,因为您希望能够随机访问包的依赖项

    我建议

    Map<String, Set<String>> dependsOn = new HashMap<>();
    Map<String, Set<String>> requiredBy = new HashMap<>();
    

    这样,当您删除一个包时,您可以找到它拉入的所有包(dependsOn.get(packageToDelete)),并从requiredBy中的每个条目中删除packageToDelete;如果这使得requiredBy集为空,那么该包也可以被删除

    我还建议在添加新根包时,对要添加的依赖包使用Set。以什么顺序处理它们其实并不重要,更有用的是快速处理并避免重复

    最初,我认为使用唯一的完全限定的包名作为键会更简单——更容易编码和调试。这需要一种基于名称查找包的方法,但该方法应该已经存在。但是,如果愿意,可以为Package类实现equals()hashcode(),并将它们直接用作Map

    为了阐明这可能如何工作,以下是一个例子:

    public Set<String> addDependencies(Item pkg, Item... dependencies) {
        Set<String> pkgDependsOn = dependsOn.get(pkg.getFullyQualifiedName());
        if (pkgDependsOn == null) {
            pkgDependsOn = new HashSet<>();
            dependsOn.put(pkg.getFullyQualifiedName(), pkgDependsOn);
        }
        pkgDependsOn.addAll(Stream.of(dependencies).map(dep -> dep.getFullyQualifiedName()).collect(Collectors.toSet()));
        return pkgDependsOn;
    }
    

    (我本可以用Map.merge()来代替,但写完后,我觉得它太复杂了,令人困惑。)

    返回结果Set的依赖项可能有些过分,但我可以想象在某些情况下它可能会有用

    如果您选择将包本身用作密钥,则如下所示:

    public Set<Item> addDependencies(Item pkg, Item... dependencies) {
        Set<Item> pkgDependsOn = dependsOn.get(pkg);
        if (pkgDependsOn == null) {
            pkgDependsOn = new HashSet<>();
            dependsOn.put(pkg, pkgDependsOn);
        }
        pkgDependsOn.addAll(Arrays.asList(dependencies));
        return pkgDependsOn;
    }
    

    我也没有做错误检查(比如,如果你让一个包依赖于它自己)、空检查等等