Java入门之HashSet、TreeSet以及 Map
一.HashSet
无序集合,存储和取出的顺序不同,没有索引,不存储重复元素。
HashSet 一般用于去重。
利用HashSet 集合去除ArrayList集合中的重复元素
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("d");
list.add("d");
HashSet<String> set = new HashSet<>();
set.addAll(list);
//清空原list
list.clear();
//把set中去重好的元素 装到list中
list.addAll(set);
System.out.println(list);
LinkedHashSet去重
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("c");
set.add("m");
set.add("a");
set.add("b");
set.add("c");
set.add("d");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
System.out.println(next);
}
HashSet的其他使用方法和注意事项在上篇文章中有详细介绍,在此就不多做赘述了。
二.TreeSet
TreeSet 无序 无下标 不重复
功能:排序
下面用两个简单的例子来看一下TreeSet的排序功能:
1.用comparator 比较器接口的排序方法
用TreeSet 保存四个字符串
按字符串长度排序 comparator 比较器接口
编写比较规则
将比较的规则直接传入到TreeSet的构造方法中
class CompareChar implements Comparator<Character>{
@Override
public int compare(Character o1, Character o2) {
int num = o1.compareTo(o2);
return num == 0 ? 1 : num;
}
}
TreeSet<String> set = new TreeSet<>(new CompareLength());
set.add("wanglong");
set.add("zhuxiaojie");
set.add("liuliu");
set.add("sheng");
System.out.println(set);
2.需要在自己创建类中重写排序规则的排序方式
* 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)
* 录入的学生信息格式(姓名,语文成绩,数学成绩,英语成绩)
* 按照总分从高到低输出到控制台。输出学生所有信息
System.out.println("请输入学生信息" + "录入的学生信息格式(姓名,语文成绩,数学成绩,英语成绩)");
Scanner scanner = new Scanner(System.in);
TreeSet<Student> set = new TreeSet<>();
//循环输入五次
while (set.size() < 5) {
//接受用户输入 生生,120,120,120
String string = scanner.nextLine();
//切割字符串
String[] strings = string.split(",");
//取出数组的元素 并且把字符串转成整数
int chinese = Integer.parseInt(strings[1]);
int math = Integer.parseInt(strings[2]);
int english = Integer.parseInt(strings[3]);
//创建学生对象
Student student = new Student(strings[0], chinese, math, english);
set.add(student);
}
System.out.println(set);
//在Student类中重写排序规则
//重写排序规则 按总分排 并且不能去重
@Override
public int compareTo(Student o) {
int num = this.sum - o.sum;
return num == 0 ? 1 : num;
}
三.Map
- 双列集合
- Map(双列集合的父接口)
- 1.以键值对形式来存储数据 key—value
2.键值唯一(键值不能重复)
依赖关系:HashSet 依赖于 HashMap
- 实际上向HashSet中添加元素,
相当于向 Map的 key列添加元素。
HashMap:去重的功能 (该功能属于key列)
- TreeMap:排序的功能 (该功能属于key列)
Map中常用的几种方法
添加键值对元素(put)
put方法的返回值 是被覆盖的value的值
HashMap<String, Integer> map = new HashMap<>();
//添加 键值对元素
//put方法的返回值 是被覆盖的value的值
Integer v1 = map.put("wanghong", 15);
Integer v2 = map.put("dondong", 20);
Integer v3 = map.put("shengsheng", 18);
Integer v4 = map.put("liuliu", 30);
Integer v5 = map.put("wanghong", 24);
System.out.println(map);
System.out.println(v1);
System.out.println(v2);
System.out.println(v3);
System.out.println(v4);
System.out.println(v5);
常用方法:
包含 key
包含 value
获取所有key的Set集合
获取所有value集合
通过key删除整个键值对
清空map
HashMap<String, Integer> map = new HashMap<>();
map.put("wanghong", 10);
map.put("hong", 8);
map.put("wang", 16);
map.put("wan", 18);
//判断map中是否包含key
boolean b1 = map.containsKey("hong");
System.out.println(b1);
//判断map中是否包含value
boolean b2 = map.containsValue(10);
System.out.println(b2);
//获取所有key的Set集合(核心方法)
Set<String> keySet = map.keySet();
System.out.println(keySet);
//获取所有value集合
Collection<Integer> values = map.values();
System.out.println(values);
//通过key删除整个键值对
Integer remove = map.remove("wanghong123");
System.out.println(remove);
//清空map
map.clear();
System.out.println(map);
两种方法遍历Map
1.迭代器遍历
HashMap<Person, String> map = new HashMap<>();
map.put(new Person("王宏", 24),"江苏");
map.put(new Person("东东", 26),"河南");
map.put(new Person("生生", 20),"安徽");
//取出所有key的Set集合
Set<Person> keySet = map.keySet();
//取出迭代器
Iterator<Person> iterator = keySet.iterator();
//遍历所有key
while (iterator.hasNext()) {
//取出集合中的key值
Person key = (Person) iterator.next();
//利用key取出对应的value
String value = map.get(key);
System.out.println("key=" + key + " " + "value = " + value);
}
2.利用Entry对象来遍历
//利用Entry对象来遍历map
//Entry对象封装了一个键值对对象
//一个key 一个对应的value
HashMap<String, Integer> map = new HashMap<>();
map.put("王宏1", 13);
map.put("王宏2", 11);
map.put("王宏3", 12);
//获取所有Entry对象的Set集合
Set<Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
//取出集合中的每个entry对象
Entry<String, Integer> entry = (Entry<String, Integer>) iterator.next();
//从entry中取出 key-value
System.out.println(entry.getKey() + " " + entry.getValue());
}