Java基础比较器和国际化4月打卡day19

举报
java厂长 发表于 2022/04/13 09:21:42 2022/04/13
【摘要】 Java基础之多线程(综合案例)4月打卡day19关于作者作者介绍🍓 博客主页:作者主页🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。1、比较器—Comparable1.1 Comparable对象数组排序:public ...

Java基础之多线程(综合案例)4月打卡day19

关于作者

  • 作者介绍


🍓 博客主页:作者主页

🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。

🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。

1、比较器—Comparable

1.1 Comparable

对象数组排序:public static void sort(Object[] a)

package com.day13.demo;
​
import java.util.Arrays;
​
class Pers{
    private String name;
    private int age;
    public Pers(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Pers [name=" + name + ", age=" + age + "]";
    }
}
public class ComparableDemo {
    public static void main(String[] args) {
        Pers pers[] = new Pers[]{
            new Pers("张三",12),
            new Pers("李四",23),
            new Pers("刘武",54)//对象数组
        };
        Arrays.sort(pers);//要进行对象数组的排序处理
        System.out.println(Arrays.toString(pers));
    }
}

这个时候没有任何的语法错误,即:程序的代码是正确的,但是在程序执行的时候出现了以下的问题:

Exception in thread "main" java.lang.ClassCastException: com.day13.demo.Pers cannot be cast to java.lang.Comparable
    at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
    at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
    at java.util.Arrays.sort(Arrays.java:1246)
    at com.day13.demo.ComparableDemo.main(ComparableDemo.java:36)

明确的告诉用户现在发生了“ClassCaseException”,类转换异常,Person类不能变为Comparables实例。

如果要为对象指定比较规则,那么对象所在的类必须实现Comparable接口,下面首先来看一下这个接口的定义:

public interface Comaparable<T>{
    public int compareTo(T o)
}

Stirng类中的compareTo()就属于覆写Comaparable接口所的来的方法。

image-20210817191154586

实现对象数组的排序

package com.day13.demo;
​
import java.util.Arrays;
​
class Pers implements Comparable<Pers>{
    private String name;
    private int age;
    public Pers(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Pers [name=" + name + ", age=" + age + "]\n";
    }
    @Override
    public int compareTo(Pers o) {
        // TODO Auto-generated method stub
        //升序排序 如果降序排序将1 和 -1 进行位置调换
        if(this.age > o.age){
            return -1;
        }else if(this.age < o.age){
            return 1;
        }else{
            return 0;
        }
    }
}
public class ComparableDemo {
    public static void main(String[] args) {
        Pers pers[] = new Pers[]{
            new Pers("张三",12),
            new Pers("李四",23),
            new Pers("刘武",54)//对象数组
        };
        Arrays.sort(pers);//要进行对象数组的排序处理
        System.out.println(Arrays.toString(pers));
    }
}

只要是对象数组排序,就必须有Comparable接口。

1.2 二叉树( Binary Tree )

二叉树是一种排序的基本的数据结构,而如果要想为多个对象进行排序,那么就必须可以区分出对象的大小,那么就必须依靠Comparable接口完成。

二叉树的基本原理:取第一个元素作为根节点,之后每一个元素的排列要求:如果比根节点晓得数据放在左子树,如果比根节点大的数据放在右子树,在输出的时候采用中序(左-根-右)遍历的方式完成。

但是不管是何种方式操作,一定要记住,这种数据结构的实现永远都需要依靠节点类,而这个时候的节点类要保存两个节点:左,右。

2、国际化

在java.util.Locale可以找java提供国际化的相关信息

Locale构造:public Locale(String language, String country)

观察区域和语言代码

package com.day13.demo;
​
import java.util.Locale;
​
public class LocalDemo {
    public static void main(String[] args) {
        System.out.println(Locale.CHINA);//zh_CN
        System.out.println(Locale.CHINESE);//zh
    }
}
  • 中国Locale:public static final Locale CHINESE

  • 美国Locale:public static final Locale US

  • 取得当前的Locale对象:public static Locale getDefault()

当我们用eclipse打开Message.properties进行编写后不要慌,我们还有一个非常强大的工具在JDK中,CLASSPATH:C:\Program Files\Java\jdk1.8.0_241\bin 自己安装JDK的环境目录下有一个叫native2ascii.exe可以帮助我们进行转码。这种做法非常麻烦,如果要开发国际版本的软件还是自己安装一个编辑软件比较好。

image-20210817212132969

语言配置文件Message.properties

welcome.info = \u5317\u4EAC\u6B22\u8FCE\u4F60\uFF01

测试文件LocaleDemo.java

package com.day13.demo;
​
import java.util.ResourceBundle;
​
public class LocaleDemo {
    public static void main(String[] args) {
        //这个时候设置的baseName没有后缀,而且一定要在CLASSPATH之中
        ResourceBundle res = ResourceBundle.getBundle("com.day13.msg.Message");
        //北京欢迎你!
        System.out.println(res.getString("welcome.info"));
    }
}

资源文件的名称就只是 包.名称前缀

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。