领导要求整理一批source修改记录,主要是记录修改的源文件+修改时间+文件在工程中的目录
。首先从类似禅道的web站获取数据(根据日期履历复制到本地),然后找出文件的最终修改时间。主要时间消耗在按日期复制修改文件履历上面。主要难点在于后期数据去重,对被修改文件的最新时间获取。
起初想着一条一条在excel上面人工检索核对,大概有四个月的数据,不停的搜索然后去重就可以了。比较费劲,懒惰是程序员的优良品质,想到重复工作还是写个方法吧。
数据类似 :目录–>时间形式,键值对形式直接使用map处理,目录文件为key,时间为value,先用两个数组承载数据然后将数据分别作为key:value装入map中,hashMap相同的key会更新value值,正好把时间变成最新,然后把map数据放到连个list中打印出来,复制回去即可
//将两组数据存入两个数组
String string [] = {"src/application.xml","src/main/account.java","src/main/util.java"};
String timeString [] ={"2021/06/03 19:42","2021/06/03 19:42","2021/06/03 19:42"};
System.out.println(timeString.length);
List<MyEntry> list = new ArrayList<>();
//创建一个只有key:value两个属性的类(类似HashMap的Entry内部类),存储数据用
for(int i =0;i<string.length;i++) {
MyEntry entry = new MyEntry(string[i],timeString[i]);
list.add(entry);
}
//取得list后发现部分其中的value值并非是“升序”排列的,有部分数据无序,所以首先要按照value进行排序,然后利用Map的去key重复值的特性得到结果值
list.sort(new Comparator<MyEntry>() {
@Override
public int compare(MyEntry o1, MyEntry o2) { //o1<o2
if(o1.val.trim().compareTo(o2.val.trim())<0) {
return -1;
}else if(o1.val.trim().compareTo(o2.val.trim())==0) { //o1=o2
return 0;
}else {//o1>o2
return 1;
}
}
});
Map<String,String> map = new TreeMap<>();
//list排序后存入map去重得到结果
for (MyEntry myEntry : list) {
map.put(myEntry.key, myEntry.val);
}
//由于存入map后重复key对应的value会被其它的时间覆盖导致失去时间升序排列。优秀的农民需要看到整齐的田地,再次进行list.sort()排序
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
list.clear();
for (Entry<String, String> myEntry : map.entrySet()) {
list2.add(myEntry.getKey());
list3.add(myEntry.getValue());
MyEntry entry = new MyEntry(myEntry.getKey(),myEntry.getValue());
list.add(entry);
}
list.sort(new Comparator<MyEntry>() {
@Override
public int compare(MyEntry o1, MyEntry o2) { //o1<o2
if(o1.val.trim().compareTo(o2.val.trim())<0) {
return -1;
}else if(o1.val.trim().compareTo(o2.val.trim())==0) { //o1=o2
return 0;
}else {//o1>o2
return 1;
}
}
});
List<String> list4 = new ArrayList<>();
List<String> list5 = new ArrayList<>();
for (MyEntry myEntry : list) {
list4.add(myEntry.getKey());
list5.add(myEntry.getVal());
}
List<String> list6 = new ArrayList<>();
for (String string2 : list4) {
list6.add(string2.split("/")[(string2.split("/").length-1)]);
}
//最终打印三个结果集,修改的文件名,文件路径,修改时间
System.out.println(list4.size()+"==="+list4);
System.out.println(list5.size()+"==="+list5);
System.out.println(list6.size()+"==="+list6);
用到了一个map.entrySet(),list.sort(),new Comparator() {}比较方法。
源码如下:
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es;
return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}
该方法为接口Map中的方法,treemap实现了该方法,返回一个Entry类型的Set,Collections中有更丰富的操作集合的方法,可以实现采用value进行排序,采用自定义比较器进行比较。