今日学习内容总结如下:
Set集合
无序,不允许重复
扩展自Collection接口
public interface Set<E> extends Collection<E>
- 允许使用null元素
- 这里没有什么新方法,只对 add()、equals() 和 hashCode() 方法添加了限制
- HashSet和TreeSet是Set的实现 Set—>hashSet --> linkedHashSet SortedSet —> TreeSet
HashSet的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问;如果有两个Key重复,那么会覆盖之前的;
实现类 :
HashSet:
equals返回true,hashCode返回相同的整数;
哈希表;存储的数据是无序的。
LinkedHashSet:此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。
存储的数据是有序的
有一篇英文文章,请获取其中有哪些字符(去重复)
去重复---Set
使用字符流读取数据
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
public class Test1 {
public static void main(String[] args) {
Set set = new HashSet<>();
set.add(null);
Random r=new Random();
r.setSeed(200);
for(int i=0;i<5;i++) {
int rint=r.nextInt(100);
System.out.println(rint);
set.add(rint);
}
Iterator it=set.iterator();
while(it.hasNext())
System.out.print(it.next()+"\t");
System.out.println();
//LinkedHashSet在Hashset的基础上引入一个链表,通过链表记录添加元素的顺序
set=new LinkedHashSet<>();
Random r1=new Random();
r1.setSeed(200);
for(int i=0;i<5;i++) {
int rint=r1.nextInt(100);
System.out.println(rint);
set.add(rint);
}
Iterator it1=set.iterator();
while(it1.hasNext())
System.out.print(it1.next()+"\t");
System.out.println();
//TreeSet
set=new TreeSet<>();
r1=new Random();
for(int i=0;i<5;i++) {
int rint=r1.nextInt(100);
System.out.println(rint);
set.add(rint);
}
it1=set.iterator();
while(it1.hasNext())
System.out.print(it1.next()+"\t");
}
}
有一篇文章要求统计每个字符的出现次数,并按照出现次数排序后输出
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
public class Test5 {
public static void main(String[] args) throws IOException {
Reader r = new BufferedReader(new FileReader("Test1.java"));
List<CharNum> list = new LinkedList<>();
int kk = -1;
while ((kk = r.read()) != -1) {
// 如果集合中没有对应的字符则添加到集合中;如果已经包含了该字符则修改出现次数
CharNum cn = new CharNum((char) kk);
int pos = list.indexOf(cn);
if (pos > -1) {
cn = list.get(pos);
cn.setNum(cn.getNum() + 1);
} else
list.add(cn);
}
r.close();
Set<CharNum> set = new TreeSet<>(list);
System.out.println(set);
}
}
class CharNum implements Comparable<CharNum> {
private char c;
private int num;
public CharNum(char c) {
super();
this.c = c;
this.num = 1;
}
public char getC() {
return c;
}
public void setC(char c) {
this.c = c;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "CharNum [c=" + c + ", num=" + num + "]";
}
@Override
public int hashCode() {
return Objects.hash(c);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CharNum other = (CharNum) obj;
return c == other.c;
}
@Override
public int compareTo(CharNum o) {
// 首先按照出现次数排序,如果出现次数相等,则按照字符排序
int res = num - o.num;
if (res == 0)
res = c - o.c;
return res;
}
}