set不能存放重复数据,那么,set是如何区分两个数据是否重复呢?
public class Person{
private int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ListRemoveDu {
public static void main(String[] args) {
List<Person> list=new ArrayList();
Set<Person> set=new HashSet();
Person p1=new Person(1,"name1");
Person p2=new Person(2,"name2");
Person p3=new Person(3,"name3");
Person p4=new Person(2,"name2");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
for (Person p : list) {
set.add(p);
}
for (Person p : set) {
System.out.println(p.getName());
}
}
}
实际上两个重复的数据p2和p4都被添加进去了。
HashSet,这个集合类继承于Set接口,爷爷是Collection接口。首先他接受一个参数的泛型,泛型的作用就是在编译期去严格检查输入类型,HashSet添加元素时,需要对这个泛型类的hashCode值进行判断,测试是否为重复元素,如果一样,再测试equals结果。
所以以上的代码得改写成如下
public class Person{
private int id;
private String name;
public boolean equals(Object p){
if(((Person)p).getId()==this.getId()){
return true;
}else{
return false;
}
}
public int hashCode(){
return 0;
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这样就可以实现不添加重复数据了。
set的另一个实现是treeset,treeset是靠实现Comparator接口来对数据进行排序,所以不需要上面的equals方法了。
treeset的实现是
public class Person implements Comparable<Person>{
private int id;
private String name;
public int compareTo(Person person) {
if(this.getId()>person.getId()){
return -1;
}else if(this.getId()==person.getId()){
return 0;
}else{
return 1;
}
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ListRemoveDu {
public static void main(String[] args) {
List<Person> list=new ArrayList();
Set<Person> set=new TreeSet();
Person p1=new Person(1,"name1");
Person p2=new Person(2,"name2");
Person p3=new Person(3,"name3");
Person p4=new Person(2,"name2");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
for (Person p : list) {
set.add(p);
}
for (Person p : set) {
System.out.println(p.getName());
}
}
}
分享到:
相关推荐
根据给定的信息,“完整地图worldset”主要涉及的是游戏中的地图配置文件,即用来定义游戏中不同地图区域如何关联以及它们之间逻辑关系的数据结构。对于游戏开发者来说,理解这些配置文件的含义及其工作原理是非常...
在Java中,集合框架是Java.util包下的一个子集,提供了各种不同类型的集合,包括List、Map和Set等,用于满足不同的数据存储需求。 标题中的“集合的概念”指的是在计算机科学中,集合是一种数据结构,它可以存储一...
在Python编程语言中,集合(Set)是一种特殊的数据结构,...总结来说,Python中的集合是处理不重复数据和进行特定集合运算的有效工具,它们在编程中扮演着重要的角色,尤其在数据去重、成员资格检查、集合操作等方面。
Python中的`set`数据结构是一种无序且不包含重复元素的集合。在Python中,`set`通过哈希表(Hash Table)实现,这使得它能快速地进行成员资格检查和去重操作。当我们尝试将一个对象添加到`set`时,Python会首先调用...
集合类型 set 是一种无序的、不可重复的数据结构,可以用来去重和查找数据。 变量是 Python 中的基本单元,用于存储数据。变量可以理解为去超市购物的菜篮子,它们的类型和值在赋值的那一刻被初始化。Python 中的...
7. 集合(set):集合是不重复元素的无序集合,用大括号{}或set()函数创建。集合支持并集、交集、差集等数学运算,常用于去重和关系测试。 8. 字典(dict):字典是键值对的集合,键必须是唯一的,但值可以重复。...
总结来说,`Set` 是一个只包含唯一元素并自动排序的容器,适用于存储不重复的数据;而 `Map` 是键值对的集合,每个键唯一,可用于关联查询,其键不可变但值可变。两者都是STL中的高效数据结构,选择使用哪一个取决于...
总结来说,Set和Map的引入极大地丰富了JavaScript的数据处理能力,特别是对于处理不重复数据和任意类型键值对的需求。同时,WeakSet提供了一种安全的处理对象引用的方式,避免了内存泄漏的问题。在实际开发中,合理...
单元素元组需要末尾的逗号来区分它与普通的括号表达式。 5. **字典**(dict): - 无序的键值对集合,键是唯一的,不可变的,值可以是任意类型。字典用大括号包围,键值对用冒号分隔,对之间用逗号分隔。 6. **...
本文主要探讨了Python中常见的三种数据结构:序列(包括列表、元组和字符串)、映射(字典)以及集合(set)。 首先,我们来看序列。序列是Python中的一类容器,其中每个元素都有其独特的索引。列表、元组和字符串...
总结,Map和Set是JavaScript中用于数据存储和操作的重要工具,它们提供了更强大的数据结构选择,尤其在处理键值对和不重复元素的场景下。开发者可以根据项目需求和目标浏览器的兼容性来决定是否采用这些新数据类型。
集合(Set)是无序且不重复的元素集合,类似于数学中的集合概念。集合支持基本的集合运算,如并集(union),交集(intersection),差集(difference)和对称差集(symmetric_difference)。集合操作通常用于成员资格测试、...
优化方面,可以考虑使用更高效的数据结构(如`std::set`或`std::unordered_map`)来减少查找时间,或者利用多线程技术提高处理速度。 总结来说,文学研究助手是一个基于数据结构和算法的应用,它通过巧妙地设计和...
1. 整型(int):Python中的整型数据不区分正负,可以表示任意大小的整数。例如,`10`, `-20` 都是整型数据。 2. 浮点型(float):浮点型用于表示带有小数部分的数字,如 `3.14`, `-0.5`。Python支持科学记数法,...
65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几...
6. 集合(set):用大括号`{}`表示,不包含重复元素,支持数学运算如并集、交集和差集。 7. 布尔型(bool):只有两个值,True和False,常用于逻辑判断。 在给定的作业中,你可以创建变量`my_money`、`drink_cost`...
集合(set)是无序且不重复的元素集合,用花括号{}包围,元素之间用逗号分隔。集合支持集合运算,如并集、交集和差集。 在Python的开发环境中,可以直接通过命令行交互式运行代码,或者编写脚本文件后通过解释器...