用于存储对象数组列表的二维数组列表或数组列表映射?

2D arraylist or map of arraylist for storing arraylist of objects?

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

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

或者我可以使用地图,但据我所知,一个键只能分配一个值,我真的不想再做一个 class 只是为了存储一堆对象当 Arraylist 做得很好时。我可以用列表作为元素制作地图吗?我完全没有和他们混过。

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

谢谢!

这就是我在评论中所说的实现:

Class 艺术:

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

class 艺术收藏:

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