`
mushme
  • 浏览: 789257 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

set是如何区分重复数据的

 
阅读更多
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

    根据给定的信息,“完整地图worldset”主要涉及的是游戏中的地图配置文件,即用来定义游戏中不同地图区域如何关联以及它们之间逻辑关系的数据结构。对于游戏开发者来说,理解这些配置文件的含义及其工作原理是非常...

    集合的概念及应用和HashSet保证数据不重复的原理

    在Java中,集合框架是Java.util包下的一个子集,提供了各种不同类型的集合,包括List、Map和Set等,用于满足不同的数据存储需求。 标题中的“集合的概念”指的是在计算机科学中,集合是一种数据结构,它可以存储一...

    set集合判断集合中是否有无元素-Python入门教程笔记(五)集合(set)及函数.pdf

    在Python编程语言中,集合(Set)是一种特殊的数据结构,...总结来说,Python中的集合是处理不重复数据和进行特定集合运算的有效工具,它们在编程中扮演着重要的角色,尤其在数据去重、成员资格检查、集合操作等方面。

    python中的set实现不重复的排序原理

    Python中的`set`数据结构是一种无序且不包含重复元素的集合。在Python中,`set`通过哈希表(Hash Table)实现,这使得它能快速地进行成员资格检查和去重操作。当我们尝试将一个对象添加到`set`时,Python会首先调用...

    Python数据类型运算符

    集合类型 set 是一种无序的、不可重复的数据结构,可以用来去重和查找数据。 变量是 Python 中的基本单元,用于存储数据。变量可以理解为去超市购物的菜篮子,它们的类型和值在赋值的那一刻被初始化。Python 中的...

    Python3.7.2中文文档-标准库-Python数据类型

    7. 集合(set):集合是不重复元素的无序集合,用大括号{}或set()函数创建。集合支持并集、交集、差集等数学运算,常用于去重和关系测试。 8. 字典(dict):字典是键值对的集合,键必须是唯一的,但值可以重复。...

    Map和Set的区别

    总结来说,`Set` 是一个只包含唯一元素并自动排序的容器,适用于存储不重复的数据;而 `Map` 是键值对的集合,每个键唯一,可用于关联查询,其键不可变但值可变。两者都是STL中的高效数据结构,选择使用哪一个取决于...

    第十一单元.pptx_电子版_pptx版

    总结来说,Set和Map的引入极大地丰富了JavaScript的数据处理能力,特别是对于处理不重复数据和任意类型键值对的需求。同时,WeakSet提供了一种安全的处理对象引用的方式,避免了内存泄漏的问题。在实际开发中,合理...

    Python数据分析及可视化-11

    单元素元组需要末尾的逗号来区分它与普通的括号表达式。 5. **字典**(dict): - 无序的键值对集合,键是唯一的,不可变的,值可以是任意类型。字典用大括号包围,键值对用冒号分隔,对之间用逗号分隔。 6. **...

    Python常见数据结构整理.pdf

    本文主要探讨了Python中常见的三种数据结构:序列(包括列表、元组和字符串)、映射(字典)以及集合(set)。 首先,我们来看序列。序列是Python中的一类容器,其中每个元素都有其独特的索引。列表、元组和字符串...

    JavaScript之Map和Set_动力节点Java学院整理

    总结,Map和Set是JavaScript中用于数据存储和操作的重要工具,它们提供了更强大的数据结构选择,尤其在处理键值对和不重复元素的场景下。开发者可以根据项目需求和目标浏览器的兼容性来决定是否采用这些新数据类型。

    2.Python数据类型.rar

    集合(Set)是无序且不重复的元素集合,类似于数学中的集合概念。集合支持基本的集合运算,如并集(union),交集(intersection),差集(difference)和对称差集(symmetric_difference)。集合操作通常用于成员资格测试、...

    数据结构文学研究助手实验报告-2011-06

    优化方面,可以考虑使用更高效的数据结构(如`std::set`或`std::unordered_map`)来减少查找时间,或者利用多线程技术提高处理速度。 总结来说,文学研究助手是一个基于数据结构和算法的应用,它通过巧妙地设计和...

    完整图文版Python高级教程 Python在金融大数据领域的应用 02 第二讲 基本数据类型与结构(共24页).rar

    1. 整型(int):Python中的整型数据不区分正负,可以表示任意大小的整数。例如,`10`, `-20` 都是整型数据。 2. 浮点型(float):浮点型用于表示带有小数部分的数字,如 `3.14`, `-0.5`。Python支持科学记数法,...

    java面试宝典

    65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几...

    Python零基础知识手册-变量&数据类型.docx

    6. 集合(set):用大括号`{}`表示,不包含重复元素,支持数学运算如并集、交集和差集。 7. 布尔型(bool):只有两个值,True和False,常用于逻辑判断。 在给定的作业中,你可以创建变量`my_money`、`drink_cost`...

    python变量和数据类型的介绍.docx

    集合(set)是无序且不重复的元素集合,用花括号{}包围,元素之间用逗号分隔。集合支持集合运算,如并集、交集和差集。 在Python的开发环境中,可以直接通过命令行交互式运行代码,或者编写脚本文件后通过解释器...

Global site tag (gtag.js) - Google Analytics