JAVA TreeSet 遍历指定元素

 solve:用subSet方法得到一个子视图并进行遍历

可以去这个题目里面练习一下

示例代码:(自定义数据可以自己在类里面定义一个比较器)

package xrz385;
import java.util.*;
import java.io.*;
public class d {

	public static int n,m,t1;
	static long sx,sy;
	public static void main(String[] args)throws Exception{
		BufferedReader rd=new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter wd=new BufferedWriter(new OutputStreamWriter(System.out));
		String k[]=rd.readLine().split(" ");
		n=Integer.parseInt(k[0]);m=Integer.parseInt(k[1]);
		sx=Long.parseLong(k[2]);sy=Long.parseLong(k[3]);
		int ans=0;
		HashMap<Long,TreeSet<Long>>sk=new HashMap<>();
		HashMap<Long,TreeSet<Long>>sp=new HashMap<>();
		for(int i=1;i<=n;i++) {
			k=rd.readLine().split(" ");
			long x=Long.parseLong(k[0]),y=Long.parseLong(k[1]);
			TreeSet<Long>tx=new TreeSet<>();
			TreeSet<Long>tx2=sk.getOrDefault(x,tx);
			tx2.add(y);
			sk.put(x,tx2);
			TreeSet<Long>ty=new TreeSet<>();
			TreeSet<Long>ty2=sp.getOrDefault(y,ty);
			ty2.add(x);
			sp.put(y,ty2);
		}
		for(int i=1;i<=m;i++) {
			k=rd.readLine().split(" ");
			char c=k[0].charAt(0);
			long ci=Long.parseLong(k[1]);
			if(c=='U') {
				if(sk.containsKey(sx)==false) {
					sy+=ci;
					continue;
				}
				else {
					ans+=sk.get(sx).subSet(sy,true,sy+ci,true).size();
					for(Long y:sk.get(sx).subSet(sy,true,sy+ci,true)) {
						 sp.get(y).remove(sx);
					}
					sk.get(sx).subSet(sy,true,sy+ci,true).clear();
				}
				sy+=ci;
			}
			if(c=='D') {
				if(sk.containsKey(sx)==false) {
					sy-=ci;
					continue;
				}
				else {
					ans+=sk.get(sx).subSet(sy-ci,true,sy,true).size();
					for(Long y:sk.get(sx).subSet(sy-ci,true,sy,true)) {
						 sp.get(y).remove(sx);
					}
					sk.get(sx).subSet(sy-ci,true,sy,true).clear();
				}
				sy-=ci;
			}
			if(c=='L') {
				if(sp.containsKey(sy)==false) {
					sx-=ci;
					continue;
				}
				else {
					ans+=sp.get(sy).subSet(sx-ci,true,sx,true).size();
					for(Long x:sp.get(sy).subSet(sx-ci,true,sx,true)) {
						 sk.get(x).remove(sy);
					}
					sp.get(sy).subSet(sx-ci,true,sx,true).clear();
				}
				sx-=ci;
			}
			if(c=='R') {
				if(sp.containsKey(sy)==false) {
					sx+=ci;
					continue;
				}
				else {
					ans+=sp.get(sy).subSet(sx,true,sx+ci,true).size();
					for(Long x:sp.get(sy).subSet(sx,true,sx+ci,true)) {
						 sk.get(x).remove(sy);
					}
					sp.get(sy).subSet(sx,true,sx+ci,true).clear();
				}
				sx+=ci;
			}
		}
		wd.write(sx+" "+sy+" "+ans);
		wd.flush();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值