根据中文名称首字母进行分组

打印 上一主题 下一主题

主题 516|帖子 516|积分 1548

很多项目中,需要用到中文名称到首字母进行分组,例如:城市、游戏等等。。。
  1.     /**
  2.      * 将集合数据按照汉字首字母分组排序
  3.      *
  4.      * @param list
  5.      * @return
  6.      */
  7.     public Map<String, Object> screenManufacturer(List<Game> list) {
  8.         Set<String> hasAddedNameSet = new HashSet<>();
  9.         long start = System.currentTimeMillis();
  10.         try {
  11.             // 输出26个字母
  12.             Map<String, Object> map = new TreeMap<>();
  13.             int n = 0;
  14.             for (int i = 1; i < 27; i++) {
  15.                 String word = String.valueOf((char) (96 + i)).toUpperCase();
  16.                 // 循环找出 首字母一样的数据
  17.                 List<Game> letter = new ArrayList<>();
  18.                 for (Iterator<Game> iter = list.listIterator(); iter.hasNext(); ) {
  19.                     Game game = iter.next();
  20.                     if (hasAddedNameSet.contains(game.getName())) {
  21.                         continue;
  22.                     }
  23.                     String pybf = PinyinUtil.getFullSpell(game.getName());
  24.                     String firstWord = pybf.substring(0, 1);
  25.                     if (word.equalsIgnoreCase(firstWord)) {
  26.                         hasAddedNameSet.add(game.getName());
  27.                         letter.add(game);
  28.                     }
  29.                     n++;
  30.                 }
  31.                 map.put(word, letter);
  32.             }
  33.             log.info("总共循坏了{}次", n);
  34.             long end = System.currentTimeMillis();
  35.             log.info("总耗时:{}毫秒", end - start);
  36.             return map;
  37.         } catch (Exception e) {
  38.             e.printStackTrace();
  39.         }
  40.         return null;
  41.     }
复制代码
  1. import net.sourceforge.pinyin4j.PinyinHelper;
  2. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
  3. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  4. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  5. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
  6. import java.text.Collator;
  7. import java.util.*;
  8. public class PinyinUtil {
  9.     public static void main(String[] args) {
  10.         List<String> names = new ArrayList<>();
  11.         names.add("张三");
  12.         names.add("李四");
  13.         names.add("王武");
  14.         names.add("刘德华");
  15.         names.add("精舍蓝军");
  16.         Map<String, Object> stringObjectMap = screenManufacturer(names);
  17.         System.out.println(stringObjectMap);
  18.     }
  19.     /**
  20.      * 获取汉字串拼音,英文字符不变
  21.      */
  22.     public static String getFullSpell(String chinese) {
  23.         StringBuffer pybf = new StringBuffer();
  24.         char[] arr = chinese.toCharArray();
  25.         HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  26.         defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
  27.         defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  28.         for (int i = 0; i < arr.length; i++) {
  29.             if (arr[i] > 128) {
  30.                 try {
  31.                     pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
  32.                 } catch (BadHanyuPinyinOutputFormatCombination e) {
  33.                     e.printStackTrace();
  34.                 }
  35.             } else {
  36.                 pybf.append(arr[i]);
  37.             }
  38.         }
  39.         return pybf.toString();
  40.     }
  41.     /**
  42.      * 将集合数据按照汉字首字母分组排序
  43.      */
  44.     public static Map<String, Object> screenManufacturer(List<String> list) {
  45.         try {
  46.             Collator com = Collator.getInstance(Locale.CHINA);
  47.             // 按字母排序
  48.             Collections.sort(list, com);
  49.             // 输出26个字母
  50.             Map<String, Object> map = new TreeMap<>();
  51.             for (int i = 1; i < 27; i++) {
  52.                 String word = String.valueOf((char) (96 + i)).toUpperCase();
  53.                 // 循环找出 首字母一样的数据
  54.                 List<String> letter = new ArrayList<>();
  55.                 for (String str : list) {
  56.                     String pybf = getFullSpell(str);
  57.                     String zm = pybf.substring(0, 1);
  58.                     if (word.equals(zm)) {
  59.                         letter.add(str);
  60.                     }
  61.                 }
  62.                 map.put(word, letter);
  63.             }
  64.             return map;
  65.         } catch (Exception e) {
  66.             e.printStackTrace();
  67.         }
  68.         return null;
  69.     }
  70. }
复制代码
POM文件
  1.   <!--拼音-->
  2.         <dependency>
  3.             <groupId>com.belerweb</groupId>
  4.             <artifactId>pinyin4j</artifactId>
  5.             <version>2.5.0</version>
  6.         </dependency>
复制代码
天生的效果
  1. {
  2.   "code": 200,
  3.   "message": "操作成功",
  4.   "data": {
  5.     "A": [],
  6.     "B": [],
  7.     "C": [
  8.       {
  9.         "gameId": "g123",
  10.         "name": "CS"
  11.       }
  12.     ],
  13.     "D": [
  14.       {
  15.         "gameId": "g123",
  16.         "name": "地下城勇士"
  17.       },
  18.       {
  19.         "gameId": "g123",
  20.         "name": "DNF"
  21.       },
  22.       {
  23.         "gameId": "g123",
  24.         "name": "DOTA"
  25.       }
  26.     ],
  27.     "E": [],
  28.     "F": [],
  29.     "G": [],
  30.     "H": [],
  31.     "I": [],
  32.     "J": [],
  33.     "K": [],
  34.     "L": [],
  35.     "M": [
  36.       {
  37.         "gameId": "g123",
  38.         "name": "魔兽世界"
  39.       }
  40.     ],
  41.     "N": [],
  42.     "O": [],
  43.     "P": [],
  44.     "Q": [],
  45.     "R": [],
  46.     "S": [
  47.       {
  48.         "gameId": "g123",
  49.         "name": "守卫剑阁"
  50.       }
  51.     ],
  52.     "T": [
  53.       {
  54.         "gameId": "7fbf48bb3204",
  55.         "name": "test22"
  56.       }
  57.     ],
  58.     "U": [],
  59.     "V": [],
  60.     "W": [
  61.       {
  62.         "gameId": "g123",
  63.         "name": "王者荣耀"
  64.       }
  65.     ],
  66.     "X": [],
  67.     "Y": [],
  68.     "Z": [
  69.       {
  70.         "gameId": "g123",
  71.         "name": "诛仙"
  72.       }
  73.     ]
  74.   }
  75. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表