【问题标题】:2D arraylist or map of arraylist for storing arraylist of objects?用于存储对象数组列表的二维数组列表或数组列表映射?
【发布时间】:2021-09-26 14:34:54
【问题描述】:

我正在为我父亲的艺术业务制作一个简单的簿记程序,以帮助他处理他们的工作流程(一个画廊,有一群艺术家通过一个收银台出售他们的作品),我有点难过我应该去存储我拥有的数据的方向。我目前有一个对象数组列表,用于存储每个艺术家所做的每笔销售。所以它有几百个元素长,每个元素都有关于销售的信息(它不是特定于艺术家的,只是在 2 周内通过登记册的每一次销售)。它是按名称排序的,但理想情况下,我想将其拆分为各个艺术家,以便他们都属于自己的列表,以便更好地访问和控制。

所以现在我被困在最好的方法上,基本上都是一张地图。我在想一个 2D arrayList,第一个维度是为特定艺术家分配的字符串,以便于访问,第二个维度是一个列表,其中包含他们的所有销售,我可以在输入信息时添加到该列表中。

或者我可以使用地图,但是从我所读到的内容中,一个键只能分配一个值,而且我真的不想创建另一个类来存储一堆对象,而 Arraylist 可以做到这一点.我可以用列表作为元素制作地图吗?我根本没有惹过他们。

或者是否有更好的方法来解决所有这些问题?我还没有学习数据结构,所以我基本上是尽我所能使用我的 OOP 知识。我还计划对数据进行序列化,以便可以滚动使用(他们每月获得 excel 报告,我使用 Apache 进行解析),如果这有任何改变的话。

谢谢!

【问题讨论】:

  • 我会学习和练习 Trail: Collections 而不是不知所措。
  • 我认为 Map> 是一个很好的数据结构,因为艺术家可以很容易地找到销售额或任何东西,就像你说的那样。如果您只有 List>,以后可能会引起一些混乱。不过我的意见
  • 我建议创建一个包含艺术家姓名等字段的类Art,然后为Art 的每个字段创建一个Map<String,List<Art>>,这样您就可以快速找到所有内容。并制作List<Art> 来保存所有艺术作品。如果你想让我写代码作为答案,我会的。
  • @LuckyBandit74 是的,我同意,我可能会走那条路。使用地图也是一种很好的做法。谢谢
  • @Ofek 是的,这可能是最好的方向。我已经有一个 Art 类来存储他们的信息,所以我将使用地图,因为它的实现非常简单。谢谢!

标签: java dictionary arraylist data-structures


【解决方案1】:

这是我在cmets中所说的实现:

课堂艺术:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Art implements Serializable {
    public String author;
    public String mainColor;
    public String field3;

    public Art(String author, String mainColor, String field3) {
        this.author = author;
        this.mainColor = mainColor;
        this.field3 = field3;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.writeObject(author);
        out.writeObject(mainColor);
        out.writeObject(field3);
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        author = (String)in.readObject();
        mainColor = (String)in.readObject();
        field3 = (String)in.readObject();
    }
}

类艺术收藏:

import java.io.*;
import java.util.*;

public class ArtCollection {
    private final File file;
    private final List<Art> arts = new ArrayList<>();
    private final Map<String,List<Art>> byAuthor = new HashMap<>();
    private final Map<String,List<Art>> byMainColor = new HashMap<>();
    private final Map<String,List<Art>> byField3 = new HashMap<>();

    public ArtCollection(File file) throws ArtException {
        this.file = file;
        try (var in = new ObjectInputStream(new FileInputStream(file))) {
            for (Object art : (Iterable<?>)in.readObject())
                addArt((Art)art);
        } catch (Exception e) {
            throw new ArtException(e);
        }
    }

    public void save() throws ArtException {
        try (var out = new ObjectOutputStream(new FileOutputStream(file))) {
            out.writeObject(arts);
        } catch (Exception e) {
            throw new ArtException(e);
        }
    }

    private void addArt(Art art) {
        arts.add(art);
        byAuthor.computeIfAbsent(art.author, arg->new ArrayList<>()).add(art);
        byMainColor.computeIfAbsent(art.mainColor, arg->new ArrayList<>()).add(art);
        byField3.computeIfAbsent(art.field3, arg->new ArrayList<>()).add(art);
    }

    private void removeArt(Art art) {
        if (arts.remove(art)) {
            byAuthor.get(art.author).remove(art);
            byMainColor.get(art.mainColor).remove(art);
            byField3.get(art.field3).remove(art);
        }
    }

    public List<Art> getByAuthor(String author) {
        return get(author, byAuthor);
    }

    public List<Art> getByMainColor(String mainColor) {
        return get(mainColor, byMainColor);
    }

    public List<Art> getByField3(String field3) {
        return get(field3, byField3);
    }

    private static List<Art> get(String key, Map<String,List<Art>> map) {
        List<Art> arts = map.get(key);
        return arts == null ? Collections.emptyList() : Collections.unmodifiableList(arts);
    }

    public static class ArtException extends RuntimeException {
        public ArtException(Throwable cause) {
            super(cause);
        }
    }
}

一切都是O(1),除了构造函数、保存和removeArt

【讨论】:

  • 这非常有用,感谢您抽出宝贵时间!尤其是时间因素。我担心如果有成千上万的条目,它会变得多么低效。谢谢!!
  • 即使 add 是 O(n) 这也不会是一个问题,如果你想要一些高级搜索,你可以随时问我。此外,如果您不等待更多解决方案,请将此解决方案标记为已接受。
  • 听起来不错,我以后可能会就此向您发送消息。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多