将对象从一个 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)
您将同一个列表推送到 current
和 queued
。 Java 具有引用语义,这意味着如果您将 arrayList
推送到 current
,current
持有 reference 到 arrayList
所以如果您更改它,current
将指向更改后的列表。
由于您将同一个列表推送到 queued
,YAML 将在列表首次出现时添加一个锚点 &id001
,然后添加一个别名 *id001
来引用同一个列表.
由于您根本不需要 current
中的列表,因此您似乎想要
FileBasics.FILETYPE.BANWAVE.getConfig().set("current", path);
虽然我不知道这是什么类型的 API 以及它是否接受字符串。
我对 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)
您将同一个列表推送到 current
和 queued
。 Java 具有引用语义,这意味着如果您将 arrayList
推送到 current
,current
持有 reference 到 arrayList
所以如果您更改它,current
将指向更改后的列表。
由于您将同一个列表推送到 queued
,YAML 将在列表首次出现时添加一个锚点 &id001
,然后添加一个别名 *id001
来引用同一个列表.
由于您根本不需要 current
中的列表,因此您似乎想要
FileBasics.FILETYPE.BANWAVE.getConfig().set("current", path);
虽然我不知道这是什么类型的 API 以及它是否接受字符串。