A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wjiuchaol1 中级黑马   /  2015-12-12 00:59  /  760 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

set体系:
   无序 唯一.

HasSet  :

Set集合 无索引 不可以重复. 存取的位置不一致

HashSet<String> hs  = new HashSet<>)();
boolean b1 = hs.add("a");
boolean b2 = hs.add("a");
hs.add("b");
hs.add("c");
hs.add("d");

System.out.println(hs);  //哈洗塞得 继承体系中有重写toString方法
System.out.println(b1);
System.out.println(b2);

for(String string : hs)
Sysytem.out.println(string)

HasSet 是如何保证唯一性的?:
依赖两个方法:重写equals() 和 hascold()
实际开发中,这两个方法不用我们自己写就自动生成即可.
为什么hashCode() 方法的规则写的这么复杂?
因为我们知道不同的对象的哈希值一般不同,
所以哈希值不一样的对象肯定是不同的对象
没必要在去equals 方法比较对象的属性,这样做就可以提高效率

总结:记忆
  hashSet 保证元素唯一性依赖: hashCode() 和equals()方法 如果是hashSet存储对象
必须重写这俩个方法

理解.看源码.我们发现HashSet类的add方法.决定是否添加元素依赖的是以下这个判断


步骤?:1, 判断要添加的元素和集合中遍历到的当前元素的哈希值是否相同
      如果相同: 说明这两个对象有可能一样 接着判断
      如果不同: 说名这两个对象肯定不是同一个对象,直接添加
        2,判断两个对象的地址值是否相等
       如果相等: 说明两个对象是同一个对象不添加.
        如果不等:说明两个对象有可能不是同一个对象.紧接着一次比较对象的个个属性值就可以了

        3,调用equals 方法比较对象的各个属性值
HashSet<Person> hs = new HashSet<>()
hs.add(new Person("张散",23))
hs.add(new Person("撒的",23))
hs.add(new Person("散发的复苏",23))
hs.add(new Person("俄方的",23))
hs.add(new Person("松岛枫",23))
hs.add(new Person("果然",23))

System.out.println(hs.size());
System.out.println(hs);



LinkedHashSet:
底层是链表实现的 具有唯一性  唯一一个有序  是set集合中唯一一个能保证怎么存就怎么取的集合对象
因为是HashSet的子类 也是保证元素唯一的 与HashSet的原理一样



LiinkedHashSet<String> lhs = new LinkedHashSet<>()

lhs.add("a");
lhs.add("a");
lhs.add("a");
lhs.add("a");
lhs.add("a");

System.out.println(lhs);


练习题:
    编写一个程序, 获取10个1-20的随机数 要求随机数不能重复 并把最终的随机数输出到控制台

分析: 有Random类 创建随机数对象
      需要存储10个随机数 而且不能重复 用HashSet集合
      如果HashSet的size是小于10就可以不断的存储 如果大于等于10就停止存储
      通过Random类中的nextInt(n)方法 获取1-20之间的随机数 并将这些随机数存储在HashSet集合中 遍历HashSet

Random r = new Random();

HashSet<integer> hs = new HashSet<>();

while(hs.size()< 10)

hs.add(r.nextInt(20) + 1)


for(integer integer : hs)
System.out.println(integer);

思考:使用Scanner从键盘读取一行输入 打印出不同的字符

思路:1,创建Scanner 接受用户输入内容,
     2,因为要去重,用HashSet来存
     3,把字符串转成字符数组
     4,遍历字符数组,把里边的元素一次添加到集合中
     5,遍历集合.
Scanner sc = new Scanner(System.in)

System.out.println("请输入一航字符串");

HashSet<Character> hs = new HasSet<>()

String line = sc.nextLine();
char[] arr = line.toCharArray();

for(char c : arr)

hs.add(c);

for(Character ch : hs)

System.out.println(ch)


以知:ArrayList(String) list = new ArrayList<>();
list.add("a")
list.add("a")
list.add("a")
list.add("b")
list.add("b")
list.add("b")
list.add("b")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")

如果去除其中的重复元素.

分析:创建一个List集合 存储若干个重复元素
     单独定义方法去除重复
     在打印List集合

ArrayList<String> list = new ArrayLIst<>();
list.add("a")
list.add("a")
list.add("a")
list.add("b")
list.add("b")
list.add("b")
list.add("b")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")
list.add("c")

getSingle(list);
System.out.println(list);
方法:去除list集合中的重复元素
1,创建一个LinkedHashSet集合
2,将List集合中的所有元素添加到LinkedHashSet集合
3,将list集合中的元素清除 ,在把LinkedHashSet集合中的元素添加回List集合中
public static void getSingle(List<String>list)

LinkedHashSet<String> lhs = new LinkedHashSet<>();

lhs.addAll(list);

list.clear();

list.addArr(lhs);


TreeSet是怎么保证元素唯一性的:
是用来对元素进行排序的  同样也可以保证元素唯一
让基本类去实现ComParable 然后重写接口中的comPareTo方法
comPareTo方法反悔值是一个int类型
当comPareTo方法反悔0的时候值有一个元素
当comPareTo方法反悔正数的时候集合会怎么存就怎么取 (元素往右放)
当comPareTo方法反悔的负数时候集合会倒叙存储   (元素往左放)


用TreeSet 排序的时候注意事项
一定要分析清楚什么是主要条件 什么是次要条件.

掌握.如果是升序(从小到大)排列就是this. - p.
如果是降序(从大到小) 排列:就是p. - this .
简单记忆, 前-后 就是从小到大. 后-前就是从大到小



TreeSet(Interger) ts = new TreeSet<>()
ts.add(1);
ts.add(1);
ts.add(2);
ts.add(2);
ts.add(3);
ts.add(3);
System.out.println(ts);



implements Comparable
TreeSet(Person> ts = new TreeSet<>();
ts.add(new Person("张散",22));
ts.add(new Person("张散的",22));
ts.add(new Person("张散是",22));
ts.add(new Person("张散发",22));
ts.add(new Person("张散去",22));

System.out.println(ts)
年龄排序:int num = this.age - o.age;
return num == 0 ? this.name.comPareTo(o.name) :num


TreeSet(Person> ts = new TreeSet<>();
ts.add(new Person("张散",223));
ts.add(new Person("张散的",222));
ts.add(new Person("张散是",122));
ts.add(new Person("张散发",2232));
ts.add(new Person("张散去",2442));

system.out.println(ts);
System.out.println('张'+0);
System.out.println('张'+0);
System.out.println('张'+0);
System.out.println('张'+0);

姓名排序:int num = this.name.comPareTo(o.name);
return num  == 0? this .age - o.age :num

int result  = this.name .length() - p.name.length();//  安姓名长度排
result =(result == 0 ) ? this.name.compareTo(p.name) :result//  长度一样,按照姓名的内容排
result = (result  == 0 )? this.age - p.age :result ;// 姓名的长度 内容都一样 按照年龄排
return result;


需求:将字符串按照长度排序
TreeSet<String>  ts = new TreeSet<>(new CompareBylen(){
});//comparator c = new comparator
ts.add("aaaaaaaa");
ts.add("z");
ts.add("wc");
ts.add("nba");
ts.add("cba");

System.out.println(ts);
第二种方式:
创建TreeSet集合对象的时候 传一个比较器借口的 子类对象进来.

class CompareBylen implements Comparator<String>
public int compare(String s1 , String s2)//按照字符串长度比较
int num = s1.length() - s2.length(); //长度为主要条件

return num == 0 ? s1.compareTo(s2) : num;//内容为次要条件

注意:
        1,如果创建TreeSet集合的时候传入了比较起接口对象,并且基本类也实现了Comparable 接口
那么排序的规则有限使用比较器传入的比较器
        简单既.
        如果两种排序方式都有 优先使用集合自带的比较器

在次提示. 一定要记住.什么是主要什么是次要

TreeSet的原理:
TreeSet是用来排序的.可以指定一个顺序,.对象存入之后会按照指定的顺序排列

评分

参与人数 1黑马币 +3 收起 理由
张研老师 + 3 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马