Лучший способ хранить данные в Java с большим количеством измерений? - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть некоторые входные данные, такие как:

  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 голосов
/ 28 апреля 2019

Вы могли бы смоделировать это как карту артефактов:

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 и hashcode методы для Artifact класса, потому что объекты этого класса будут использоваться в качестве ключей в HashMap.Если вы хотите также поддерживать версию пакета, просто добавьте такое поле в класс Artifact и добавьте соответствующий конструктор, методы получения, установки и измените методы equals и hashcode соответственно.

0 голосов
/ 28 апреля 2019

Примерно так может работать, если в вашем случае есть одноуровневая вложенная зависимость:

Базовый 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 и добавляет еще один параметр 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")))
    );

0 голосов
/ 28 апреля 2019

Пакет и данные использования выглядят одинаково.Поэтому я бы использовал карту:

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

Пакеты - это ключи, используемые зависимости - это элементы значения.

0 голосов
/ 28 апреля 2019

Звучит так, как будто вы намереваетесь представить некоторую графоподобную структуру.

Первая наивная реализация могла бы / будет использовать определенные классы, такие как Package и Entry, где пакет, вероятно, имеет список / набор из Entry объектов (а запись имеет строку имя + версия).

Конечно, поскольку вы в конце концов намереваетесь создать какой-то граф, вам, вероятно, стоит поискать и такие решения, как graphql .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...