Java进阶之路~Set集合

Set:无序(没有下标) 不重复的集合
一 HashSet
核心:去重
public static void fun1() {
	//创建一个HashSet
	//保存 f f aa bb dd
	HashSet<String> hashSet = new HashSet<>();
	hashSet.add("f");
	hashSet.add("f");
	hashSet.add("a");
	hashSet.add("a");
	hashSet.add("b");
	hashSet.add("b");
	hashSet.add("d");
	hashSet.add("d");
	//有序: 怎么存进去 打印出来就什么顺序
	//迭代器遍历
	for (String string : hashSet) {
		System.out.println(string);
	}
}

public static void fun2() {
	//创建Set集合 保存6个人 两重复
	HashSet<Person> hashSet = new HashSet<>();
	hashSet.add(new Person("奥特曼",12));
	hashSet.add(new Person("奥特曼",12));
	hashSet.add(new Person("假面骑士",14));
	hashSet.add(new Person("假面骑士",14));
	hashSet.add(new Person("发送快递",12));
	hashSet.add(new Person("发送快递",12));
	for (Person person : hashSet) {
		System.out.println(person);
	}
}

而如若想打印的顺序为存储的顺序,需要具有有序的性质,此时使用LinkedHashSet

public static void fun3() {
	//Linked 表示 有序
	//怎么存的,打印出来,还是原来的顺序
	LinkedHashSet<String> set = new LinkedHashSet<>();
	set.add("f");
	set.add("f");
	set.add("a");
	set.add("a");
	set.add("b");
	set.add("b");
	set.add("d");
	set.add("d");
	for (String string : set) {
		System.out.println(string);
	}
}

根据HashSet性质,编写几个案例

1.编写一个程序,获取10个1至20的随机数,要求随机数不能重复

public static void fun4() {
	//编写一个程序,获取10个1至20的随机数,要求随机数不能重复
	//创建一个set ,循环生成10个随机数添加到Set中,去重
	//去重系统类的对象,不用重写那两个方法
	HashSet< Integer> set = new HashSet<>();
	
	a:while(set.size() < 10) {
//		for(int i = 0; i < 10 - set.size(); i++) {
			int rd = (int)(Math.random()*20 + 1);
			set.add(rd);//自动装箱
//			if (set.size() == 10) {
//				break a;
//			}
//		}
	}
	System.out.println(set.size());//10
	System.out.println(set);//10个不同随机数组
}

2.利用set集合,去除ArrayList集合中的重复元素(操作原ArrayList , ArrayList保存aabbccdd)

public static void main(String[] args) {		
	HashSet<String> set = new HashSet<>();
	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");
	set.addAll(list);
	//清空list集合
	list.clear();
	//所有元素 放回list中
	list.addAll(set);		
}

二 TreeSet
核心:排序

排序步骤:

1.实现Comparable接口

2.重写接口中的compareTo()方法

3.编写你想要的排序规则

public static void fun1() {
	//创建一个TreeSet 添加几个数 查看效果
	TreeSet<Integer> set = new TreeSet<>();
	set.add(1);
	set.add(4);
	set.add(5);
	set.add(2);
	set.add(3);
	set.add(3);
	set.add(3);
	set.add(8);		
	set.add(6);
	set.add(7);
	System.out.println(set);
}

莫忘了Set集合是无序不重复的,因此打印出来的是


根据TreeSet排序的特点,写几个经典案例

public static void fun2() {
	//创建一个TreeSet 添加4个人 查看效果
	//按年龄排序
	TreeSet<Person> set = new TreeSet<>();
	set.add(new Person("大海",18));
	set.add(new Person("恐龙",28));
	set.add(new Person("地狱",28));
	set.add(new Person("地狱",22));
	System.out.println(set);
}

只打印出一个

因为,在Person中重写的compareTo方法,返回的默认值是0

public int compareTo(Person o) {
	// TODO Auto-generated method stub
	return 0;
}

在实现comparable接口中的方法时:

返回0 不存储元素 只有一个元素

返回正数 打印数据 正序输出

返回负数 打印数据 倒序输出

注意:TreeSet在存储的时候,只跟compareTo方法的返回值有关

@Override
public int compareTo(Person o) {
	//按年龄排序
//	return	this.age - o.getAge();
	//按姓名排序
//	return this.name.compareTo(o.getName());
	//主要按年龄排序 次要按姓名排
	int num = this.age - o.getAge();
	//
	return (num == 0) ? this.name.compareTo(o.getName()) : num; 
}

1.在一个集合ArrayList中存储了无序并且重复的字符串

要求:排序,而且不能去除重复(用比较器) 主要按字符串长度比较,次要按字符比

public static void fun4() {
	ArrayList<String> list = new ArrayList<>();
	list.add("dahai");
	list.add("pengqian");
        list.add("fanpeng");
	list.add("dahai");
	list.add("liuzhih");
	list.add("zhangjianhai");
	list.add("tianrui");
	TreeSet<String> set = new TreeSet<>(new StringLengthImpl());
	set.addAll(list);
	list.clear();
	list.addAll(set);
	System.out.println(list);
}

创建比较器

class StringLengthImpl implements Comparator<String>{
	//实现比较器方法
	@Override
	public int compare(String o1, String o2) {
		//实现你的比较规则
		int length = o1.length() - o2.length();
		//主要按长度,次要按字符串
		int num = o1.compareTo(o2);
		int rel = (length == 0) ? num : length;
		return rel == 0 ? 1 : rel;
	}	
}

2.键盘接收一个字符串,程序对其中所有字符进行排序

public static void fun5() {
	//键盘接收一个字符串, 程序对其中所有字符进行排序 要求保留重复的
	System.out.println("请输入一个字符串");
	Scanner scanner = new Scanner(System.in);
	String  string = scanner.nextLine();
	char[] charArray = string.toCharArray();
	TreeSet<Character> set = new TreeSet<>(new CharImpl());
	for (int i = 0; i < charArray.length; i++) {
		set.add(charArray[i]);
	}
	System.out.println(set);
}
class CharImpl implements Comparator<Character>{
	@Override
	public int compare(Character o1, Character o2) {
		int num = o1.compareTo(o2);
		return num == 0? 1 : num;
	}
}

3.程序启动后,可以从键盘输入接收多个整数,直到输入quit时结束输入,把所有输入的整数倒序排列打印

public static void fun6() {
	//  程序启动后, 可以从键盘输入接收多个整数,
	//  直到输入quit时结束输入. 
	//  把所有输入的整数倒序排列打印.
	System.out.println("请输入一段整数 , quit时结束");
	Scanner scanner = new Scanner(System.in);
//	String string = scanner.nextLine();
//	char[] charArray = string.toCharArray();
//	TreeSet<Character> set = new TreeSet<>(new Integer1Impl());	
//	for (int i = 0; i < charArray.length; i++) {
//		set.add(charArray[i]);
//	}
//	System.out.println(set);
			
	//创建set
	TreeSet<Integer> set = new TreeSet<>(new Integer2Impl());
	while(true) {
		//接受用户输入
		String string = scanner.nextLine();
		//判断是不是quit
		if (string.equals("quit")) {
			break;
		}
		//转化成数字
		int num = Integer.parseInt(string);
		//保存到集合Set中
		set.add(num);
	        }
	        System.out.println(set);
	}
class Integer2Impl implements Comparator<Integer>{
	@Override
	public int compare(Integer o1, Integer o2) {
		int num = o1 - o2 ;
		return num == 0? 1 : -num;
	}	
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Set(集合)里面的元素是无序的,但没有重复的元素 2. 两个实现类HashSet(LinkHashSet)和TreeSet,TreeSet有排序功能(Set set=new TreeSet();set.add(new Integer(8)); set.add(new Integer(4)); set.add(new Integer(7));)输出后的结果是:4 7 8 Eg: package test; import java.util.*; public class Set{ public static void main(String[] args) { //先实例化一个set Set<String> stringSet=new HashSet<String>(); //向set里面添加元素 stringSet.add("123"); stringSet.add("wer"); stringSet.add("345"); //将set里的元素取出 Iterator<String> stringIter=stringSet.iterator(); while(stringIter.hasNext()){ String str=stringIter.next(); System.out.println(str); System.out.println("~~~~~~~~~~~"); } System.out.println("stringSet里面有"+stringSet.size()+"元素"); } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2.List(列表<接口>)以线性方式存储,有序,允许重复主要实现类有LinkList(采用链表数据结构)和ArrayList(代表可大可小的数组) Eg: package test; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class Map { public static void main(String[] args) { List list=new ArrayList(); list.add(10); list.add(2); list.add(34); //对list数组进行自然排序 Collections.sort(list); //依次检索输出list的所有对象 // for(int i=0;i<list.size();i++){ // System.out.println(list.get(i)); // } Iterator Iter=list.iterator(); while(Iter.hasNext()){ System.out.println(Iter.next()); } } } 3.Map(映射<集合>)是无序的,是一种把键对象和值对象进行映射的集合,它每一个元素都包含一对键对象和值对象,给出键对象就可以得到值对象,键对象不允许重复,对值没有要求,多个任意键对象可以映射到一个值对象上;如果有相同键对象,最后一次加入的键对象和值对象将会覆盖以的; Eg: package test; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class NewMap { public static void main(String[] args) { //向map里添加键值对 //如果要对键进行排序Map map=new TreeMap(); Map<Integer,String> map=new TreeMap<Integer,String>(); //Map map=new HashMap(); map.put(1, "yi"); map.put(23, "er"); map.put(12, "san"); map.put(3, "si"); //遍历map Set keys=map.keySet(); Iterator<Integer> stringIter=keys.iterator(); while(stringIter.hasNext()){ int key=stringIter.next(); String value=(String) map.get(key);//根据键key得到value的值 System.out.println(key+"---"+value); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值