gpt4 book ai didi

java - 将 map 写入文本文件 java

转载 作者:行者123 更新时间:2023-11-30 10:35:17 24 4
gpt4 key购买 nike

我有一个 HashMap<Person,List<Pet>需要保存到文本文件中。我写了这个方法:

 public void writeToNotepad(){
try(PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(textFileName + ".txt")))) {
if (map.size() < 1)
return;
Set<Map.Entry<Person, List<Pet>>> mapEntry = map.entrySet();
for (Map.Entry<Person, List<Pet>> mapEn :
mapEntry) {
Person p = mapEn.getKey();
Iterator<Pet> iter = mapEn.getValue().iterator();
while (iter.hasNext()){
Pet pet = iter.next();
pw.println(p.getName() + " " + p .getAge() + " " + p.getSex()
+ " " + pet.getName()
+ " " + pet.getType()
+ " " + pet.getAge());
}
}

pw.flush();
} catch (IOException e) {
e.printStackTrace();
}

}

但是它多次保存了映射键(我认为这是因为迭代器)这是输出:

JOHN 10 MALE Dog 3
AISEC 12 MALE Loo Cat 12
AISEC 12 MALE Kitty Cat 4

如您所见,Aisec 重复了 2 次。很快我需要从这个文本文件中读取以填充 map 。这是写入文件的好方法,还是我可以使用更好的方法?

最佳答案

...如果名称包含两个中间有空格的单词怎么办?

为什么需要发明自己的序列化和反序列化格式?为什么不使用像 json 这样的行业标准,您可以在其中使用许多可以进行序列化和反序列化的库中的任何一个。你需要我告诉你怎么做吗?

编辑:

好吧,原来使用json并没有我一开始想的那么简单。不要误会我的意思,它仍然比自定义格式更好,因为它可以防止错误并支持像我上面描述的那样的边缘情况。

json 的障碍在于每个对象和属性的键都必须是字符串。因此,当 key 是用户定义的类型(如 Person 在您的情况下)时,它没有正确序列化 - 在可以执行 json 序列化之前需要一个过渡数据结构。

所以这就是我所做的:对于字典中的每个条目,我创建了一个包含两个条目的映射:一个带有 Person 对象的 json 字符串表示的“person”条目,以及一个带有 json 字符串表示的“pets”条目宠物列表的字符串表示形式。所以最终要序列化的字符串实际上是一个 MapList

给你一个想法:每个 map 条目看起来像这样的 json:

{
"person":{"name":"AISEC","age":12,"sex":"MALE"},
"pets":[
{"name":"Loo","age":12,"type":"Cat"},
{"name":"Kitty","age":4,"type":"Cat"}
]
}

反序列化就是简单的逆向操作。

我正在使用 Jackson作为 json 解析器和编写器的库

这是序列化方法。它返回一个可以写入文件的 String:

public String dictToJson(Map<Person, List<Pet>> map) throws IOException
{
ObjectMapper mapper = new ObjectMapper();
// serialized dictionary is list of maps
List<Map<String, String>> jsonDictionary = new ArrayList<>();
for (Map.Entry<Person, List<Pet>> mapEntry : map.entrySet()) {
// each map entry becomes its own map instance with two entries
Map<String, String> jsonEntry = new HashMap<>();
// write person key as "person" with json string represetation of person object
jsonEntry.put("person", mapper.writeValueAsString(mapEntry.getKey()));
// write pets value as "pets" key with json string represetation of pets list
jsonEntry.put("pets", mapper.writeValueAsString(mapEntry.getValue()));
jsonDictionary.add(jsonEntry);
}
return mapper.writeValueAsString(jsonDictionary);
}

反序列化方法accpets String(文件的全部内容):

public Map<Person, List<Pet>> jsonToDict(String json) throws IOException
{
Map<Person, List<Pet>> map = new HashMap<>();
ObjectMapper mapper = new ObjectMapper();
// read json String into list of maps
List<Map<String, String>> jsonDictionary =
mapper.readValue(json, new TypeReference<List<Map<String, Object>>>(){});
// each list item is a map with two entries
for (Map<String, String> jsonEntry : jsonDictionary) {
map.put(
mapper.readValue(jsonEntry.get("person"), Person.class),
mapper.readValue(jsonEntry.get("pets"), new TypeReference<List<Pet>>(){}));
}
return map;
}

使用方法及测试方法:

public static void main(String[] args)
{
Map<Person, List<Pet>> map ; {
map = new HashMap<>();
map.put(new Person("JOHN", 10, "MALE"),
Arrays.asList(new Pet[]{new Pet("Spot", 3, "Dog")}));
map.put(new Person("AISEC", 12, "MALE"),
Arrays.asList(new Pet[]{new Pet("Loo", 12, "Cat"), new Pet("Kitty", 4, "Cat")}));
}

try {
// serialize map into String
String serializedDict = dictToJson(map);
// write to file ...
System.out.println(serializedDict);
map.clear();
// de-serialize from String to map
map = jsonToDict(serializedDict);
// check if map was built ok
System.out.println(dictToJson(map));
} catch (Exception e) {
e.printStackTrace();
}
}

关于java - 将 map<Object, List<Object> 写入文本文件 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41260056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com