重复Key:value数据排序后去重,TreeMap,List.sort()

领导要求整理一批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进行排序,采用自定义比较器进行比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值