将对象从一个 YAML 列表移动到另一个时会发生奇怪的事情

Weird stuff happening when moving objects from one YAML list to other

我对 YAML 文件有疑问。 当我尝试在 .yml 文件中将对象从一个列表移动到另一个列表并保存它时,会发生这样的奇怪事情:

queued: &id001 []
current: *id001

应该发生什么:

current: Fraithor # <= Minecraft username, from queued, moved when running reQueue()
queued: [] # <= Or just nothing / delete list

reQueue() 方法:


        for (String path : FileBasics.FILETYPE.BANWAVE.getConfig().getStringList("queued")) {

            List<String> list = FileBasics.FILETYPE.BANWAVE.getConfig().getStringList("current");
            List<String> arrayList = new ArrayList<>();
            arrayList.add(path);

            list.addAll(arrayList);
            FileBasics.FILETYPE.BANWAVE.getConfig().set("current", list);
            list.remove(path);
            FileBasics.FILETYPE.BANWAVE.getConfig().set("queued", list);
            try {
                FileBasics.FILETYPE.BANWAVE.getConfig().save(FileBasics.FILETYPE.BANWAVE.getFile());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

显然,我使用单独的 class/emnum 来保存文件 (FileBasics)。这是一个很长的代码,所以我把它粘贴到 pastebin HERE (https://pastebin.com/XsqvYTBb)

您将同一个列表推送到 currentqueued。 Java 具有引用语义,这意味着如果您将 arrayList 推送到 currentcurrent 持有 referencearrayList 所以如果您更改它,current 将指向更改后的列表。

由于您将同一个列表推送到 queued,YAML 将在列表首次出现时添加一个锚点 &id001,然后添加一个别名 *id001 来引用同一个列表.

由于您根本不需要 current 中的列表,因此您似乎想要

FileBasics.FILETYPE.BANWAVE.getConfig().set("current", path);

虽然我不知道这是什么类型的 API 以及它是否接受字符串。