TreeSet和TreeMap中“相等”元素可能并不相等
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中“相等”元素可能并不相等的更多相关文章
- TreeSet与TreeMap浅解
TreeSet与TreeMap的关系: 1.TreeSet 实际上就是用TreeMap来组织数据的,因为在TreeSet中保存了一个NavigableMap<e,Object>接口实例变量 ...
- TreeSet和TreeMap不能存放重复元素?能不能存放null?其实不是这样的——灵活的二叉树
TreeSet和TreeMap不能存放重复元素?能不能存放null?其实不是这样的——灵活的二叉树 本文链接:https://blog.csdn.net/u010698072/article/de ...
- SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序。
SortedSet可自动为元素排序. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序. 练习:自定义类用TreeSet排序. 与HashSet不同, ...
- HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序
HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不 ...
- Java 集合类 TreeSet、TreeMap
TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之 ...
- 第40讲:Set、Map、TreeSet、TreeMap操作代码实战
今天来看下set map的操作,让我们从代码出发 val data = mutable.Set.empty[Int] data ++= List(1,2,3)//在空set上加入列表 data += ...
- Scala 深入浅出实战经典 第40讲:Set、Map、TreeSet、TreeMap操作代码实战
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- TreeSet和TreeMap的输出
如果加入TreeSet和TreeMap的元素没有实现comprable中的compareTo()方法,那么会报错"treeset cannot be cast to java.lang.Co ...
- TreeSet与TreeMap的源码分析 JDK7
TreeSet存储原则是:不可重复,有序的. public TreeSet() { this(new TreeMap<E,Object>()); } public TreeSet(Comp ...
随机推荐
- Django的form组件基本使用——生成标签
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = ...
- 20210716 noip17
考场 终于有一场在晚上考了 T1 随便画了画就发现要求每个点的后继个数,想起来有 dfs 和 toposort 两种方法,感觉很稳 T2 裸的网络流有 70pts?!真香 一看 T3 就想起了 Mst ...
- Java并发知识总结,超详细!
首先给大家分享一个github仓库,上面放了200多本经典的计算机书籍,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算法.机器学习.编程人生等,可以sta ...
- TCP可靠传输原理
停止等待协议 "停止等待"就是发送方在发送完一个分组后停止发送,等待接收方的确认后再继续发送. 超时重传 发送方在等待一定时间后如果还没有收到接收方的确认,此时发送方将认定分组没有 ...
- JUnit5 快速入门指南
1. 安装 在pom中添加依赖 <properties> <junit.jupiter.version>5.3.2</junit.jupiter.version> ...
- 【曹工杂谈】Maven底层容器Plexus Container的前世今生,一代芳华终落幕
Maven底层容器Plexus Container的前世今生,一代芳华终落幕 前言 说实话,我非常地纠结,大家平时只是用Maven,对于内部的实现其实也不关心,我现在非要拉着大家给大家讲.这就有个问题 ...
- 即时通讯网-TCPIP族关系图
- 通过HttpURLConnection下载图片到本地--下载附件
一.背景说明 现在我做的系统中,需要有一个下载附件的功能,其实就是下载图片到本地中.相应的图片保存在多媒体系统中,我们只能拿到它的资源地址(url),而不是真实的文件. 这里记录的是下载单个图片.下篇 ...
- Python - poetry(4)管理环境
环境隔离 poetry 核心之一:使项目环境隔离,意味着始终和本地全局 Python 环境隔离 poetry 首先会检查当前项目是否在虚拟环境中运行:如果是将直接使用它,而不创建新的:如果不是,poe ...
- RabbitMQie消息列队整理
使用方法过程,这儿只做了windows平台教程 先安装Erlang 编程软件,然后设置环境变量,在安装RabbimMQ ,这儿我下载了一个版本不行,后来换了最新版就好了,以后在使用过程 中如果有问题 ...