Set

Posted 薰衣草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Set相关的知识,希望对你有一定的参考价值。

Set:无序,不可以有重复元素

 HashSet:数据结构是哈希表,线程是非同步的。

 保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,继续判断

 元素的equals方法是否为true。

 TreeSet:可以对Set集合中的元素进行排序。

 底层数据结构是二叉树。

 保证元素唯一性的依据:compareTo方法retrun 0.

 

 TreeSet排序的第一种方式:让元素自身具备比较性

 元素需要实现Compareble接口,覆盖compareTo方法。

 也称这种方式为元素的自然顺序,或者默认顺序。


编写一程序:

 需求:

 往TreeSet集合中存储自定义对象学生。

 想按照学生的年龄进行排序。

 排序时,当主要条件相同时,一定要判断次要条件。


import java.util.Iterator;
import java.util.TreeSet;

import org.omg.CORBA.PUBLIC_MEMBER;

public class TreeSetDemo 


	public static void main(String[] args)
	
		TreeSet ts = new TreeSet();
		
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));
		
		Iterator it = ts.iterator();
		while(it.hasNext())
		
			Student stu = (Student)it.next();
			sop(stu.getName()+"::"+stu.getAge());
		
	
	public static void sop(Object obj)
	
		System.out.println(obj);
	


class Student implements Comparable//该接口强制让学生具有比较性

	private String name;
	private int age;
	
	Student(String name,int age)
	
		this.name = name;
		this.age = age;
	
	
	public int compareTo(Object obj)//底层调用
	
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s = (Student)obj;
		
		if(this.age >s.age)
			return 1;
		if(this.age == s.age)
		
			return this.name.compareTo(s.name);
			//String类已经实现了Compareble接口的compareTo方法
		
		return -1;
		
	
	
	public String getName()
	
		return name;
	
	public int getAge()
	
		return age;
	

按存入的顺序取出数据




public class TreeSetDemo 


	public static void main(String[] args)
	
		TreeSet ts = new TreeSet();
		
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));
		
		Iterator it = ts.iterator();
		while(it.hasNext())
		
			Student stu = (Student)it.next();
			sop(stu.getName()+"::"+stu.getAge());
		
	
	public static void sop(Object obj)
	
		System.out.println(obj);
	


class Student implements Comparable//该接口强制让学生具有比较性

	private String name;
	private int age;
	
	Student(String name,int age)
	
		this.name = name;
		this.age = age;
	
	
	public int compareTo(Object obj)//底层调用
	
		
		return 1;
		//return -1;//按倒序取出
//return 0;//运行结果中只有一个元素了
	
	
	public String getName()
	
		return name;
	
	public int getAge()
	
		return age;
	

TreeSet的第二种排序方式:

当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。

 

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/*
 当元素自身不具备比较性,或者具备的比较性不是所需要的。
 这时需要让容器自身具备比较性。
 定义了比较器,将比较器对象做为参数传递给TreeSet集合的构造函数
 
 当两种排序都存在时,以比较器为主
 定义一个类,实现Comparable接口,覆盖compare方法。
 */
按名字排序
public class TreeSetTest


	public static void main(String[] args)
	
		TreeSet ts = new TreeSet(new MyCompare());
		
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi02",21));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));
		ts.add(new Student("lisi06",18));
		ts.add(new Student("lisi06",29));
		
		Iterator it = ts.iterator();
		while(it.hasNext())
		
			Student stu = (Student)it.next();
			sop(stu.getName()+"::"+stu.getAge());
		
	
	public static void sop(Object obj)
	
		System.out.println(obj);
	



class Student implements Comparable//该接口强制让学生具有比较性

	private String name;
	private int age;
	
	Student(String name,int age)
	
		this.name = name;
		this.age = age;
	
	
	public int compareTo(Object obj)//底层调用
	
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s = (Student)obj;
		
		if(this.age >s.age)
			return 1;
		if(this.age == s.age)
		
			return this.name.compareTo(s.name);
			//String类已经实现了Compareble接口的compareTo方法
		
		return -1;
		
	
	
	public String getName()
	
		return name;
	
	public int getAge()
	
		return age;
	

class MyCompare implements Comparator

	public int compare(Object o1,Object o2)
	
		Student s1 = (Student)o1;
		Student s2 = (Student)o2;
		
		int num = s1.getName().compareTo(s2.getName());
		if(num==0)
		
			/*if(s1.getAge()>s2.getAge())
				return 1;
			if(s1.getAge()==s2.getAge())
				return 0;
			return -1;
			*/
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));	//名称相同时按年龄排序
		
		
		return num;
	

按字符串长度排序:

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;


public class TreeSetTest2 

	public static void main(String[] args)
	
		TreeSet tS = new TreeSet(new StrLenComparator());
		
		tS.add("abcd");
		tS.add("cc");
		tS.add("cba");
		tS.add("aaa");
		tS.add("z");
		tS.add("hahaha");
		
		Iterator it = tS.iterator();
		while(it.hasNext())
		
			System.out.println(it.next());
		
	

class StrLenComparator implements Comparator

	public int compare(Object o1,Object o2)
	
		String s1 = (String)o1;
		String s2 = (String)o2;
		
		/*
		 if(s1.length()>s2.length())
		 	return 1;
		  if(s1.length()==s2.length())
		 	return 0;
		 */
		
		int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
		if(num == 0)
			return s1.compareTo(s2);//长度相等时返回字符串的默认排序
		
		return num;
	


以上是关于Set的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1515 明辨是非 并查集 + set + 启发式合并

指数超出范围。必须是非负数且小于集合的大小

[題解]51nod_1515_明辨是非

Set

Python学习笔记7—集合

快学Scala-10--List 和Set