13.4 Set 接 口
13.4.1 Set接口的定义
13.4.2 Set接口的常用子类
1.散列的存放:HashSet
HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且是采用散列的存储方式,所以没有顺序。
package jiaqi;
import java.util.HashSet;
import java.util.Set;
public class demo465_2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set<String> s = new HashSet<String>();
s.add("A");
s.add("B");
s.add("C");
s.add("C");
s.add("C");//不可重复
s.add("D");
System.out.println(s);
}
}
2.有序的存放:TreeSet
package jiaqi;
import java.util.TreeSet;
import java.util.Set;
public class demo465_2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set<String> s = new TreeSet<String>();
s.add("B");
s.add("A");
s.add("C");
s.add("C");
s.add("C");//不可重复
s.add("D");
System.out.println(s);
}
}
3.关于TreeSet的排序说明
【例13.13】自定义类排序
package jiaqi;
import java.util.*;
class P
{
private String name;
private int age;
public P(String name,int age)
{
this.age=age;
this.name=name;
}
public String toString()
{
return this.name+"的年龄是"+this.age+"岁";
}
}
public class demo465_2 {
public static void main(String[] args) {
Set<P> allSet = new TreeSet<P>();
allSet.add(new P("张三",30));
allSet.add(new P("李四",31));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("赵六",33));
allSet.add(new P("孙七",33));
System.out.println(allSet);
}
}
【例13.14】指定排序规则
package jiaqi;
import java.util.*;
class P implements Comparable<P>
{
private String name;
private int age;
public P(String name,int age)
{
this.age=age;
this.name=name;
}
public int compareTo(P per) {
if(this.age<per.age)
{
return -1;
}
else if(this.age>per.age)
{
return 1;
}
else
{
return 0;
}
}
public String toString()
{
return this.name+"的年龄是"+this.age+"岁";
}
}
public class demo465_2 {
public static void main(String[] args) {
Set<P> allSet = new TreeSet<P>();
allSet.add(new P("张三",30));
allSet.add(new P("李四",31));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("赵六",33));
allSet.add(new P("孙七",33));
System.out.println(allSet);
}
}
【例13.15】修改Person的比较器
this.name.compareTo(per.name);//是返回int的,字典序
package jiaqi;
import java.util.*;
class P implements Comparable<P>
{
private String name;
private int age;
public P(String name,int age)
{
this.age=age;
this.name=name;
}
public int compareTo(P per) {
if(this.age<per.age)
{
return -1;
}
else if(this.age>per.age)
{
return 1;
}
else
{
return this.name.compareTo(per.name);
}
}
public String toString()
{
return this.name+"的年龄是"+this.age+"岁";
}
}
public class demo465_2 {
public static void main(String[] args) {
Set<P> allSet = new TreeSet<P>();
allSet.add(new P("张三",30));
allSet.add(new P("李四",31));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("赵六",33));
allSet.add(new P("孙七",33));
System.out.println(allSet);
}
}
4.关于重复元素的说明
【例13.16】加入重复对象
package jiaqi;
import java.util.*;
class P implements Comparable<P>
{
private String name;
private int age;
public P(String name,int age)
{
this.age=age;
this.name=name;
}
public String toString()
{
return this.name+"的年龄是"+this.age+"岁";
}
}
public class demo465_2 {
public static void main(String[] args) {
Set<P> allSet = new HashSet<P>();
allSet.add(new P("张三",30));
allSet.add(new P("李四",31));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));
allSet.add(new P("赵六",33));
allSet.add(new P("孙七",33));
System.out.println(allSet);
}
}
【例13.17】去掉重复元素
package jiaqi;
import java.util.*;
class P implements Comparable<P>
{
private String name;
private int age;
public P(String name,int age)
{
this.age=age;
this.name=name;
}
public boolean equals(Object obj)
{
if(this==obj)return true;//地址相同
if(!(obj instanceof P)) return false;
P p = (P)obj;
if(p.name.equals(this.name)&&p.age==this.age)
{
return true;
}
else
{
return false;
}
}
public int hashCode() {
// TODO 自动生成的方法存根
return this.name.hashCode()*this.age;
}
public String toString()
{
return this.name+"的年龄是"+this.age+"岁";
}
}
public class demo465_2 {
public static void main(String[] args) {
Set<P> allSet = new HashSet<P>();
allSet.add(new P("张三",30));
allSet.add(new P("李四",31));
allSet.add(new P("王五",32));
allSet.add(new P("王五",32));//不重复
allSet.add(new P("王五",32));
allSet.add(new P("赵六",33));
allSet.add(new P("孙七",33));
System.out.println(allSet);
}
}
++++++++++总结Tree,Hash注意项+++++++++
TreeSet:排序问题
1.compareTo(P per),
2.compareTo,equals,hashcode
Hash:重复问题
1.equals,hashcode