1、场景
db 里边存了一堆允许重名的文档,需要导出,且自动给重名的文档叠加数字尾缀。比如有文档名字分别是【全国富婆通讯录】、【全国富婆通讯录】、【全国富婆通讯录(1)】…你就不要问为什么要上传重名文档到 db 了,甚至还有已经带了尾缀的文档(可能富婆的世界就是这么奇妙吧*!@##%^&…)
那么生成 doc 塞进 zip 时就会异常:
java.util.zip.ZipException: duplicate entry
2、主旨
导出文件(略),需要 导出 doc /并且压缩成 zip /并且数据源于富文本 请参考 Java 富文本 导出 word 压缩包, 本篇主要讲导出的文件名重名处理。
3、思路
用 Hashmap 对文件名字去重并存储叠加数字。
4、代码
1)先有一个实体类 RichWoman.java
public class RichWoman {
String name = "";
String content = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
2)再有一个叠加命名类 TestHashmap.java
import java.util.*;
public class TestHashmap {
public static void main(String[] args) {
List<RichWoman> dataList = new ArrayList<RichWoman>();
RichWoman data = new RichWoman();
data.setName("全国富婆通讯录");
data.setContent("111111");
dataList.add(data);
data = new RichWoman();
data.setName("全国富婆通讯录");
data.setContent("222222");
dataList.add(data);
data = new RichWoman();
data.setName("全国富婆通讯录");
data.setContent("333333");
dataList.add(data);
data = new RichWoman();
data.setName("全国富婆通讯录(1)");
data.setContent("444444");
dataList.add(data);
data = new RichWoman();
data.setName("全国富婆通讯录(1)");
data.setContent("555555");
dataList.add(data);
data = new RichWoman();
data.setName("全国富婆通讯录(1)");
data.setContent("666666");
dataList.add(data);
//定义一个map, key 为名字,value 为doc尾缀的叠加数字
Map<String, Integer> nameMap = new HashMap<String, Integer>();
for (RichWoman param : dataList){
//用 HashMap 的去重先给所有名字的叠加数字置0(因为名字首次出现时不需要加尾缀)
nameMap.put(param.getName(), 0);
}
for (RichWoman param : dataList){
String name = param.getName();
int count = nameMap.get(name);
String docName = "";
if (nameMap.containsKey(name)){
if (count > 0){
docName = name + "(" + count + ")";
//如果已经包含,说明有自带尾缀的文件名占坑了,那就再叠加1
if (nameMap.containsKey(docName)){
count++;
docName = name + "(" + count + ")";
}
}else {
docName = name;
}
}else {
docName = name;
}
count++;
nameMap.put(name, count);
System.out.println(docName + ".doc" + "-------" + param.getContent());
}
}
}
3)运行效果
以上。如果有更优雅的办法欢迎留言讨论喔。