- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试根据面试过程创建一个程序(我选择 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 命令。命令语法是:
DEPEND item1 item2 item(n):包item1依赖于包item2(和item3或任何;
INSTALL item1:安装 item1 和 item1 所需的任何其他包。
REMOVE item1:删除 item1,如果可能,删除 item1 所需的包。
LIST:列出所有当前安装的包的名称。
END:标记输入的结束,单独在一行中使用时。
1) 在每个回显的 INSTALL 或 REMOVE 行后面加上响应所采取的操作,确保以正确的顺序给出操作。
2) LIST命令,显示当前安装的组件名称。
3) 对于 DEPEND 和 END 命令,除了回显外,没有输出。
4) 对于DEPEND命令,每一项只有一个依赖列表。
最佳答案
我不知道本练习中 Queue
的值(或 LinkedList
),因为您将希望能够随机访问包的依赖关系。
我会建议
Map<String, Set<String>> dependsOn = new HashMap<>();
Map<String, Set<String>> requiredBy = new HashMap<>();
这样,当您删除一个包时,您可以找到它已拉入的所有包 (dependsOn.get(packageToDelete)
) 并从每个包中删除 packageToDelete
他们在 requiredBy
中的条目;如果这使得 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;
}
我也没有做错误检查(比如如果你让一个包依赖于它自己)、空检查等。
关于java - 表示包安装和系统依赖关系的最佳数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50632731/
我听说最好不要从您系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
我听说最好不要从系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统的核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
单独安装 electron 与通过 electron-builder 安装有什么区别?我正在使用 React 构建一个 Electron 应用程序,并且已经找到了一些教程。它们安装 Electron
两者安装有什么区别?我按照安装页面上的说明在全局范围内安装了 webpack,然后我转到了入门指南,据说在那里可以在本地安装 webpack-cli。 CLI = Command Line Inter
我在 OS X Yosemite 上用 PHP 安装了默认的 Apache 服务器,安装了 pear,用 brew 安装了 Solr (brew install solr),现在我正在尝试使用 PEC
我解压并编译了 Ruby 2.1 并安装了几个支持工具。 但是当我安装了 libssl-dev 时,OpenSSL 不会安装。 我在支持 openssl 时遇到这个错误: make: *** No r
我在 android studio 2.3.1 和 gradle 3.2 中设计了 2 到 3 个应用程序。当我从它运行应用程序到任何设备或模拟器时,一切都工作正常。但是当我从构建文件夹中获取该 ap
我注意到我正在读一本书提到通过 apt-get 安装 numpy 和 opencv apt-get install python-numpy python-opencv 但我可以通过以下方式在 pip
我正在尝试在 Windows 8.1 上安装 ansicon。我提取了文件并达到了我需要调用 ansicon -i 的级别。当我在 cmd 中输入此内容并运行 python 脚本时效果很好,但是当我通
我有 linux MINT 17.3 Kernel 4.4.0-81 所有更新可用。 (由于不同的原因,我无法迁移到更新版本的 ubuntu/mint) 我已经通过 PPA 安装了 FFMPEG(不是
尝试在本地运行我的应用程序时出现错误: 我只在 chrome 浏览器中收到此错误。我尝试过不同的东西,但我不确定为什么它是 Chrome 特定的。 最佳答案 我怀疑这不是 Firebase 问题,而是
这是我第一次开发 AngularJS 应用程序并使用脚手架工具 Yeoman ( http://yeoman.io/ )。我想对我的一些图标使用 fontawesome ( http://fortaw
我知道您通常“应该”$ pip install 如果包没有 brew ,但如果有一个你想安装的 python 包,你可以使用 $ pip install或 $ brew install为了?例如,通过
我正在尝试通过 RVM 安装 Ruby 1.9.3。然而,当谈到安装 RubyGems 时,我得到了这个: curl: (22) The requested URL returned error: 4
我是真正提出问题的新手,但你去吧。 我一直在尝试按照安装指南添加 dnsname: https://github.com/containers/dnsname https://github.com/c
Studio更新至0.4.0 建筑产量为“需要1.8版Gradle”;将设置设置为1.8 bin目录; 建立 “要求1.9级”;将设置设置为1.9 bin; 建立 “要求1.8级” 啊。不知道该怎么做
我刚刚注意到 kernel.org 因维护而停机。是否有使用不同镜子的不同公式?或者我可以向 Homebrew 软件添加不同的来源(如 bundler ?)? 谢谢你的帮助! 最佳答案 快速解决方法:
当我运行时: peardev install phpunit/PHPUnit 我得到以下信息: No releases available for package "pear.phpunit.de/P
服务器操作系统为Fedora 24. 64bit。 我想安装 Git 2.6.6。 所以下载源码并安装。 此服务器离线。所以我不使用“yum”。 ./configure --prefix=/usr/l
我正在尝试在我自己的服务器(操作系统:Linux Ubuntu Server 12.04)上安装 OpenEdX,但我遇到了同样的错误。谁能帮帮我? TASK: [ insights | insta
我是一名优秀的程序员,十分优秀!