在更大维度的Java中存储数据的最佳方法?

时间:2019-04-28 14:33:44

标签: java list arraylist collections hashmap

我有一些输入,例如:

  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

  ....

因此在此数据中,我有一组由其版本定义的软件包,以及一堆在特定版本中使用的其他软件包,我想知道的是存储此类数据的最佳方法/实用方法。

4 个答案:

答案 0 :(得分:0)

听起来您打算表示一些类似结构的图形。

第一个幼稚的实现可能/将使用特定的类,例如PackageEntry,其中Package可能具有Entry对象的列表/集合(而Entry具有一个名称+版本字符串)。

当然,由于最终打算创建某种图形,因此您可能也应该研究诸如graphql之类的解决方案。

答案 1 :(得分:0)

假设您的案例中存在一层嵌套的依赖项,则类似的事情可能会起作用:

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;
    }
  }

扩展Package并添加另一个参数Artifact的{​​{1}}类:

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

答案 2 :(得分:0)

该包和使用的数据看起来相等。所以我会用地图:

class Uses { private path, version; }
Map<Uses, Set<Uses>> data;

包是键,使用的依赖项是值的元素。

答案 3 :(得分:0)

您可以将其建模为工件图:

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);
    }

我必须为equals类重写hashcodeArtifact方法,因为此类的对象将用作HashMap中的键。 如果您还希望支持软件包版本,只需将此类字段添加到Artifact类中,并添加适当的构造函数,getter,setter并相应地修改equalshashcode方法。