姓名,地址按照A,B,C......来排序java

该博客介绍了如何使用Java和Pinyin4j库实现姓名和地址的首字母排序。首先导入Pinyin4j依赖,然后创建一个工具类用于获取汉字的首字母或全拼。接着,定义一个数据对象AreaLetter,包含首字母和对应的姓名或地址列表,并实现了Comparable接口以进行排序。最后,通过遍历和比较,将数据集合作为AreaLetter对象集合并按首字母排序。
摘要由CSDN通过智能技术生成

姓名,地址按照A,B,C…来排序 java代码:

导入依赖: 查询首字母的读音

        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.0</version>
        </dependency>

获取首字母工具类,对于多音字只取第一个读音

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 获取首字母工具
 *
 * @author
 * @Date
 */
public class ChineseCharacterUtil {

    /**
     * 获取汉字首字母或全拼大写字母
     *
     * @param chinese 汉字
     * @param isFull  是否全拼 true:表示全拼 false表示:首字母
     * @return 全拼或者首字母大写字符窜
     */
    public static String getUpperCase(String chinese, boolean isFull) {
        return convertHanzi2Pinyin(chinese, isFull).toUpperCase();
    }


    /**
     * 获取汉字首字母或全拼小写字母
     *
     * @param chinese 汉字
     * @param isFull  是否全拼 true:表示全拼 false表示:首字母
     * @return 全拼或者首字母小写字符窜
     */
    public static String getLowerCase(String chinese, boolean isFull) {
        return convertHanzi2Pinyin(chinese, isFull).toLowerCase();
    }


    /**
     * 将汉字转成拼音
     * <p>
     * 取首字母或全拼
     *
     * @param hanzi  汉字字符串
     * @param isFull 是否全拼 true:表示全拼 false表示:首字母
     * @return 拼音
     */
    private static String convertHanzi2Pinyin(String hanzi, boolean isFull) {
        /***
         * ^[\u2E80-\u9FFF]+$ 匹配所有东亚区的语言
         * ^[\u4E00-\u9FFF]+$ 匹配简体和繁体
         * ^[\u4E00-\u9FA5]+$ 匹配简体
         */
        String regExp = "^[\u4E00-\u9FFF]+$";
        StringBuffer sb = new StringBuffer();
        if (hanzi == null || "".equals(hanzi.trim())) {
            return "";
        }
        String pinyin = "";
        for (int i = 0; i < hanzi.length(); i++) {
            char unit = hanzi.charAt(i);
            //是汉字,则转拼音
            if (match(String.valueOf(unit), regExp)) {
                pinyin = convertSingleHanzi2Pinyin(unit);
                if (isFull) {
                    sb.append(pinyin);
                } else {
                    sb.append(pinyin.charAt(0));
                }
            } else {
                sb.append(unit);
            }
        }
        return sb.toString();
    }


    /**
     * 将单个汉字转成拼音
     *
     * @param hanzi 汉字字符
     * @return 拼音
     */
    private static String convertSingleHanzi2Pinyin(char hanzi) {
        HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
        outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        String[] res;
        StringBuffer sb = new StringBuffer();
        try {
            res = PinyinHelper.toHanyuPinyinStringArray(hanzi, outputFormat);
            sb.append(res[0]);//对于多音字,只用第一个拼音
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        return sb.toString();
    }


    /***
     * 匹配
     * <P>
     * 根据字符和正则表达式进行匹配
     *
     * @param str 源字符串
     * @param regex 正则表达式
     *
     * @return true:匹配成功  false:匹配失败
     */
    private static boolean match(String str, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.find();
    }

}

首字母和首字母对应的数据集合对象:

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
public class AreaLetter implements Comparable<AreaLetter>{
    private String letter;

    private List<String> list =new ArrayList<>();

//需要按照首字母排序 实现Comparable接口
    @Override
    public int compareTo(AreaLetter o) {
        return this.letter.compareTo(o.getLetter());
    }
}

//代码逻辑实现

public List<AreaLetter> getAreaLetter() {
        // 从数据库查询的姓名或者地址集合
        List<MeterReadingAreaEntity> list = meterReadingAreaService.getArea();
        List<String> stringList = new ArrayList<>();
        //将区域名称和编码拼接到一起
        for (MeterReadingAreaEntity meterReadingAreaEntity : list) {
           stringList.add(meterReadingAreaEntity.getMeterAreaName().trim()+","+meterReadingAreaEntity.getMeterAreaCode());
        }
        Comparator<Object> com= Collator.getInstance(java.util.Locale.CHINA);
        //将区域名称根据英文字母进行排序
        Collections.sort(stringList, com);
        List<AreaLetter> areaLetterList=new ArrayList<>();
        String str;
        AreaLetter areaLetter = new AreaLetter();
        //将相同读音的放在一起 多音字取第一个读音
        loop:for (int i = 0; i < stringList.size(); i++) {
            str= ChineseCharacterUtil.getUpperCase(stringList.get(i),false).substring(0,1);
            for (AreaLetter letter : areaLetterList) {
                if (letter.getLetter().equals(str)) {
                    letter.getList().add(stringList.get(i));
                    //跳转到指定位置继续执行 此处continue可以换成break
                    continue loop;
                }
            }
            if(i>0&&!(ChineseCharacterUtil.getUpperCase(stringList.get(i-1),false).substring(0,1)).equals(str)){
                areaLetter = new AreaLetter();
                areaLetter.setLetter(str);
                areaLetter.getList().add(stringList.get(i));
                areaLetterList.add(areaLetter);
                continue;
            }
            areaLetter.setLetter(str);
            areaLetter.getList().add(stringList.get(i));
            areaLetterList.add(areaLetter);

        }
        //根据字符串AreaLetter.getLetter()排序 如A,B,C,D,E,F,G...
        Collections.sort(areaLetterList);
        return areaLetterList;
    }

第一次写,是个菜鸟,有问题 希望大家指出来,谢谢大家

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是实现代码: Person类: import java.util.Comparator; public class Person implements Comparable<Person> { private String name; private int income; private int age; private Book book; public Person(String name, int income, int age, Book book) { this.name = name; this.income = income; this.age = age; this.book = book; } public String getName() { return name; } public int getIncome() { return income; } public int getAge() { return age; } public Book getBook() { return book; } @Override public int compareTo(Person o) { int result = Integer.compare(o.income, this.income); if (result != 0) { return result; } result = Integer.compare(this.age, o.age); if (result != 0) { return result; } result = this.name.compareTo(o.name); if (result != 0) { return result; } return Comparator.comparing(Book::getPrice).thenComparing(Book::getName).compare(this.book, o.book); } } Book类: public class Book { private String name; private int price; public Book(String name, int price) { this.name = name; this.price = price; } public String getName() { return name; } public int getPrice() { return price; } } 测试代码: import java.util.TreeSet; public class Main { public static void main(String[] args) { Book book1 = new Book("Java编程思想", 100); Book book2 = new Book("深入浅出设计模式", 80); Book book3 = new Book("Effective Java", 120); TreeSet<Person> set = new TreeSet<>(); set.add(new Person("张三", 100000, 25, book1)); set.add(new Person("李四", 80000, 30, book2)); set.add(new Person("王五", 120000, 20, book3)); for (Person person : set) { System.out.println(person.getName() + " " + person.getIncome() + " " + person.getAge() + " " + person.getBook().getName() + " " + person.getBook().getPrice()); } } } 输出结果: 王五 120000 20 Effective Java 120 张三 100000 25 Java编程思想 100 李四 80000 30 深入浅出设计模式 80
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值