Day11
学习目标:
1.Comparator接口的使用;
2.Map集合。
一、Comparator接口的使用
此接口定义排序只能按照compareTo()定义的排序规则;
如果同一类对象要有多种排序方式,应该为该类定义不同的比较器(实现Comparator接口的类)TreeSet有一个构造方法允许给定比较器,它就会根据给定的比较器对元素进行排序
eg:package comparator;
public class Boy {
private String name;
private double money;
private int face;
public Boy(){
}
public Boy(String name, double money, int face) {
super();
this.name = name;
this.money = money;
this.face = face;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public int getFace() {
return face;
}
public void setFace(int face) {
this.face = face;
}
@Override
public String toString() {
return "Boy [name=" + name + ", money=" + money + ", face=" + face
+ "]";
}
}
//facerule
package comparator;
import java.util.Comparator;
// 以face为第一排序规则
package comparator;
import java.util.*;
import java.util.Comparator;
public class FaceRule implements Comparator<Boy> {
public int compare(Boy b1,Boy b2){
if(b1.getFace()>b2.getFace()){
return -1;
}else if(b1.getFace()<b2.getFace()){
return 1;
}else{
if(b1.getMoney()>b2.getMoney()){
return -1;
}else if(b1.getMoney()<b2.getMoney()){
return 1;
}
else{
return b1.getName().compareTo(b2.getName());
}
}
}
}
//moneyrule
package comparator;
import java.util.Comparator;
// 以money为第一排序规则
package comparator;
import java.util.*;
public class MoneyRule implements Comparator<Boy>{
public int compare(Boy b1, Boy b2) {
if(b1.getMoney()>b2.getMoney()){
return -1;
}else if(b1.getMoney()<b2.getMoney()){
return 1;
}else{
if(b1.getFace()>b2.getFace()){
return -1;
}else if(b1.getFace()<b2.getFace()){
return 1;
}else{
return b1.getName().compareTo(b2.getName());
}
}
}
}
//test
package comparator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Boy> ts1=new TreeSet<Boy>(new FaceRule());
ts1.add(new Boy("大红",80.5,20));
ts1.add(new Boy("小红",99.9,1));
ts1.add(new Boy("红红",60.5,20));
ts1.add(new Boy("智障",80.9,60));
ts1.add(new Boy("瓜皮",40.9,50));
System.out.println("以face为第一标准:");
for(Boy b:ts1){
System.out.println(b);
}
System.out.println("********************************");
System.out.println("以money为第一标准:");
TreeSet<Boy> ts2=new TreeSet<Boy>(new MoneyRule());
ts2.add(new Boy("大红",80.5,20));
ts2.add(new Boy("小红",99.9,1));
ts2.add(new Boy("红红",60.5,20));
ts2.add(new Boy("智障",80.9,60));
ts2.add(new Boy("瓜皮",40.9,50));
for(Boy b:ts2){
System.out.println(b);
}
}
}
//运行结果:
以face为第一标准:
Boy [name=智障, money=80.9, face=60]
Boy [name=瓜皮, money=40.9, face=50]
Boy [name=大红, money=80.5, face=20]
Boy [name=红红, money=60.5, face=20]
Boy [name=小红, money=99.9, face=1]
********************************
以money为第一标准:
Boy [name=小红, money=99.9, face=1]
Boy [name=智障, money=80.9, face=60]
Boy [name=大红, money=80.5, face=20]
Boy [name=红红, money=60.5, face=20]
Boy [name=瓜皮, money=40.9, face=50]
二、Map集合
实现Map接口的集合类用来存储“键-值”映射对。不能把包含重复的键,但值可有多个。
Map接口方法:
eg:package map;
import java.util.*;
import java.util.Map.Entry;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String,String> map=new HashMap<>();
map.put(null,null);
map.put("apple","苹果");
map.put("sport","足球");
map.put("car","宝马汽车");
map.put("country","中国");
System.out.println("现在map集合中共有键值对:"+map.size());
System.out.println("删除之前:key为sport的元素值:"+map.get("sport"));
map.remove("sport");
System.out.println("删除之后:key为sport的元素值:"+map.get("sport"));
System.out.println("包括key为car的键值对吗?"+map.containsKey("car"));
System.out.println("包括key为animal的键值对吗?"+map.containsKey("animal"));
System.out.println("包括value为\"宝马汽车\"的键值对吗?"+map.containsValue("宝马汽车"));
Set<String> keys=map.keySet(); // 获取所有的key
System.out.println("所有的key是:");
for(String key:keys){
System.out.print(key+" ");
}
System.out.println();
System.out.println("所有的value是:");
Collection<String> values=map.values();
for(String value:values){
System.out.print(value+" ");
}
System.out.println();
System.out.println("*********遍历整个map集合**************");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for(Map.Entry<String, String> me:entrySet){
System.out.println(me.getKey()+"========>"+me.getValue());
}
}
}
(1)HashMap类:散列存放
(2)TreeMap类:“key-value”中的“key”是可“排序”的。
(3)Map.Entry接口Map中内部定义的一个接口,专门用来保存“key-value”的内容。
使用 setProperty(String key,String value)方法,因为存放的“键-值”对都是字符串
取值也应该使用getProperty(Stringkey)。
package map;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String[] args) {
Properties pro=new Properties();
pro.setProperty("oper","linux");
pro.setProperty("time","2018");
pro.setProperty("vip","yes");
System.out.println(pro.getProperty("vip"));
System.out.println(pro.getProperty("abc","没有找到对应的属性名,这是默认值"));
}
}
eg2:
package map;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String[] args) {
Properties pro=new Properties();
pro.setProperty("XX", "YY");//setProperty是调用Hashtable方法put来设置值对
pro.setProperty("time", "1996");
pro.setProperty("大佬", "xj");
System.out.println(pro.getProperty("XX"));//getProperty搜索属性,通过Key得到他的value属性
}
}
学习目标:
1.异常的概念与原理;
2. 异常的分类;
3. 处理异常的方法;
4.自定义异常。
一、异常的概念与原理
(1)定义:
import java.io.IOException;
public class CheckException {
public static void main(String[] args) {
Runtime r=Runtime.getRuntime();
try {
r.exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Finally {
public static void main(String[] args) {
int result=method();
System.out.println("结果是:"+result);
}
public static int method(){
try{
int a=100;
int b=1;
int c=a/b;
return c;
}catch(Exception e){
System.out.println("发生异常啦...");
}finally{
return 999;
}
}
}
public class RuntimeExceptionDemo {
public static void main(String[] args) {
int a=100;
int b=0;
String str=null;
int[] array=new int[5];
try{
array[5]=100;
str.equals("abc");
int c=a/b;
}catch(NullPointerException e){
System.out.println("空指针异常~~~");
}catch(ArithmeticException e){
System.out.println("算数异常~~~");
}catch(Exception e){
System.out.println("以上catch都没有捕获到异常,由最大父类Exception处理异常");
}finally{
System.out.println("无论异常是否发生,都会执行");
}
System.out.println("main()方法执行完毕!");
}
}
1.throw用来手动抛出异常对象。
2.throws用于方法声明处,用于抛出该方法体内部可能发生的异常类型。一旦在方法声明处通过throws抛出某种类型的异常,则在该方法体内部就不用处理该类型的异常,交给方法调用处处理该类型的异常。
四、自定义异常public class MyException extends Exception {
public MyException() {
super();
}
public MyException(String msg) {
super(msg);
}
}
eg:
package throwdemo;
import java.io.IOException;
public class ThrowDemo {
public static void main(String[] args) {
try{
throw new ArithmeticException(); //throw手动抛出异常对象
}catch(Exception e){
System.out.println("发生算数异常了...");
}
int a=100;
System.out.println("end....");
}
}