TreeSet和TreeMap元素之间比较大小是借助Comparator对象的compare方法。

但有些时候,即便compare()返回0也不意味着这两个元素直观上相同。

比如元素是二元组[a,b]的形式:对于[a1,b1]和[a2,b2],规定a1>a2&&b1>b2时[a1,b1]>[a2,b2],a1<a2&&b1<b2时[a1,b1]<[a2,b2],否则[a1,b1]=[a2,b2]。

也就是说即便[a1,b1]=[a2,b2]完全可能a1!=b1,a2!=b2。特别的对于TreeSet,如果添加多个所谓的“相等”元素,那么后面的元素实际上是没有被添加进去的,因为他们被判定相等,即便他们是不同的二元组。

例题:5864.游戏中弱角色的数量

你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。

如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attacki 且 defensej > defensei 。

返回 弱角色 的数量。

下面是错误的做法:将所有二元组添加进TreeSet,然后遍历properties数组,对于每个元素,通过higher()判断是否有比当前元素更大的元素。

   public int numberOfWeakCharacters(int[][] properties) {
int cnt=0;
TreeSet<int[]> set=new TreeSet<>(new Comparator<int[]>(){
public int compare(int[] a,int[] b){
if(a[0]>b[0]&&a[1]>b[1]) return 1;
else if(a[0]<b[0]&&a[1]<b[1]) return -1;
else return 0;
}
});
for(int[] p:properties) set.add(p);
for(int[] p:properties){
if(set.higher(p)!=null) cnt++;
}
return cnt;
}

比如对于输入案例properties = [[1,5],[10,4],[4,3]],实际上set中只有一个元素[1,5],因为[10,4]被判定与[1,5]相等,所以没有被添加到set,同理[4,3]也被判定与[1,5]相等,所以也没有被添加到set。



这道题正确的做法是重定义排序规则在遍历一遍properties数组即可。按攻击力降序、防守力升序的规则排序。遍历数组,记录遍历元素的最大防守值,如果不等于当前防守值,则说明前面存在元素攻击防守均强于当前元素。

   public int numberOfWeakCharacters(int[][] properties) {
Arrays.sort(properties,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
if(a[0]!=b[0]){
return b[0]-a[0];
}
else{
return a[1]-b[1];
}
}
});
int max=0,cnt=0;
for(int i=0;i<properties.length;++i){
if(max<=properties[i][1]) max=properties[i][1];
else cnt++;
}
return cnt;
}

TreeSet和TreeMap中“相等”元素可能并不相等的更多相关文章

  1. TreeSet与TreeMap浅解

    TreeSet与TreeMap的关系: 1.TreeSet 实际上就是用TreeMap来组织数据的,因为在TreeSet中保存了一个NavigableMap<e,Object>接口实例变量 ...

  2. TreeSet和TreeMap不能存放重复元素?能不能存放null?其实不是这样的——灵活的二叉树

    TreeSet和TreeMap不能存放重复元素?能不能存放null?其实不是这样的——灵活的二叉树   本文链接:https://blog.csdn.net/u010698072/article/de ...

  3. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序。

      SortedSet可自动为元素排序. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序.   练习:自定义类用TreeSet排序. 与HashSet不同, ...

  4. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序

    HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不 ...

  5. Java 集合类 TreeSet、TreeMap

    TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之 ...

  6. 第40讲:Set、Map、TreeSet、TreeMap操作代码实战

    今天来看下set map的操作,让我们从代码出发 val data = mutable.Set.empty[Int] data ++= List(1,2,3)//在空set上加入列表 data += ...

  7. Scala 深入浅出实战经典 第40讲:Set、Map、TreeSet、TreeMap操作代码实战

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  8. TreeSet和TreeMap的输出

    如果加入TreeSet和TreeMap的元素没有实现comprable中的compareTo()方法,那么会报错"treeset cannot be cast to java.lang.Co ...

  9. TreeSet与TreeMap的源码分析 JDK7

    TreeSet存储原则是:不可重复,有序的. public TreeSet() { this(new TreeMap<E,Object>()); } public TreeSet(Comp ...

随机推荐

  1. OpenCV 之 透视 n 点问题

    透视 n 点问题,源自相机标定,是计算机视觉的经典问题,广泛应用在机器人定位.SLAM.AR/VR.摄影测量等领域 1  PnP 问题 1.1  定义 已知:相机的内参和畸变系数:世界坐标系中,n 个 ...

  2. 快速模式第一包: quick_outI1()

    文章目录 1. 序言 2. quick_outI1()流程图 3. quick_outI1()源码分析 4. quick_outI1_continue()源码分析 5. quick_outI1_tai ...

  3. JS003. 事件监听和监听滚动条的三种参数( addEventListener( ) )

    全局 1 window.addEventListener('scroll', () => { 2 console.log('------') 3 console.log(document.doc ...

  4. 隐私安全设置:NET:ERR_CERT_AUTHORITY_INVALID message in Chrome.

    背景 访问一个内部网站时,遇到下面的问题,导致网站不能打开:NET:ERR_CERT_AUTHORITY_INVALID message in Chrome.从错误信息来看,这是由于网站的证书问题导致 ...

  5. [第十四篇]——Docker Machine之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Machine 简介 Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机. Docker Mac ...

  6. Docker安装GitLab与Runner(网关),常规设置,自动化用到k8s+token

    [转]图文详解k8s自动化持续集成之GitLab CI/CD Windows里面使用Debian命令行工具完成 和Docker网络相关的命令 查看某一个容器的网络 docker inspect 容器I ...

  7. Django学习day02随堂笔记

    每日测验 """ 今日考题 1.谈谈你对web框架的认识,简述web框架请求流程 2.python三大主流web框架的区别 3.安装django需要注意的事项有哪些(最少 ...

  8. html回车键搜索内容

    window.onkeydown = function(e){ // elsinput是搜索框 if(e.keyCode === 13 && elsinput.is(':focus') ...

  9. jmeter调度器的使用

    前言 使用jmeter 做压测的时候,希望对一个接口持续压测 10 分钟或者半小时,可以使用调度器设置持续压测时间. https://www.cnblogs.com/yoyoketang/p/1415 ...

  10. python的列表和java的数组有何异同

    今天面试被问到,自己学习一下. python的列表是可变长的,定义时不需要指定长度:pyhton是弱对象类型,python的列表存储的数据类型可以不相同:python的列表更加灵活,如可以通过''命令 ...