[英]The best way to store data in java with more dimensions?
我有一些输入,如:
package 1 : org.orchestr.something version= 5.1.3
uses = org.do.resource ; version= 1.2.1
uses = org.test.summer ; version= 1.5.2
package 2 : fr.test.something version= 5.1.3
uses = com.java.rest ; version= 1.0.1
uses = org.osgi.summer ; version= 1.4.2
....
所以在这个数据中,我有一组由他们的版本定义的包,并且他们在特定版本中使用了其他包,我想知道的是存储这种数据的最佳方式/实用方法。
听起来你打算代表一些图形结构。
第一个天真的实现可以/将使用特定的类,例如Package
和Entry
,其中Package可能具有Entry
对象的列表/集合(并且Entry具有名称+版本字符串)。
当然,因为你最终打算创建某种图形,你可能也应该研究诸如graphql之类的解决方案。
这样的事情可能有用,假设在你的情况下有一级嵌套依赖:
基础Artifact
类:
class Artifact {
protected String name;
protected String version;
public Artifact(String name, String version) {
this.name = name;
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
扩展Artifact
并添加另一个参数的Package
类uses
:
class Package extends Artifact {
public Package(String name, String version, List<Artifact> uses) {
super(name, version);
this.uses = uses;
}
private List<Artifact> uses;
public List<Artifact> getUses() {
return uses;
}
public void setUses(List<Artifact> uses) {
this.uses = uses;
}
}
然后,您可以根据需要将其存储为List
或Map
。
在Map
中使用的示例:
Map<String, Package> map = new HashMap<>();
map.put("package1", new Package("org.orchestr.something", "5.1.3", Arrays.asList(
new Artifact("org.do.resource", "1.2.1"),
new Artifact("org.test.summer", "1.5.2")))
);
map.put("package2", new Package("fr.test.something", "5.1.3", Arrays.asList(
new Artifact("com.java.rest", "1.0.1"),
new Artifact("org.osgi.summer", "1.4.2")))
);
包和使用数据看起来相同。 所以我会用一张地图:
class Uses { private path, version; }
Map<Uses, Set<Uses>> data;
包是键,使用的依赖项是值的元素。
您可以将其建模为工件图:
import java.util.Objects;
public class Artifact {
private String name;
private String version;
public Artifact(String name, String version) {
this.name = name;
this.version = version;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Artifact that = (Artifact) o;
return version.equals(that.version) &&
name.equals(that.name);
}
@Override
public int hashCode() {
return Objects.hash(version, name);
}
}
这将是一个用法:
public static void main(String[] args) {
Map<Artifact, Set<Artifact>> map = new HashMap<>();
Set<Artifact> dependencies = new HashSet<>();
dependencies.add(new Artifact("org.do.resource ", "1.2.1"));
dependencies.add(new Artifact("org.test.summer ", "1.5.2"));
map.put(new Artifact("org.orchestr.something", "5.1.3"), dependencies);
}
我不得不重写Artifact
类的equals
和hashcode
方法,因为这个类的对象将用作HashMap
键。 如果您还想支持包版本,只需将此字段添加到Artifact
类,并相应地添加适当的构造函数,getter,setter和修改equals
和hashcode
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.