最近碰到个需求,要求对已经按字母排完序的ListView,再按照汉字字母进行二级排序,下面是一种思路,
jmd_sbook = new ArrayList<>(); jmd_sbook_m = new ArrayList<>(); jmd_sbook_l = new ArrayList<>(); jmd_sbook_n = new ArrayList<>(); //遍历数据源,拿到关键字的第一位判定是字母数字还是汉字 for (int i = 0; i < datas.size(); i++) { boolean isSpecial = false; String name = datas.get(i).getItemTitle().toString(); String text = name.substring(0, 1); Pattern p = Pattern.compile("[a-zA-Z]"); Matcher m = p.matcher(text); if (m.matches()) { isSpecial = true; jmd_sbook_l.add(datas.get(i)); } p = Pattern.compile("[\u4e00-\u9fa5]"); m = p.matcher(text); if (m.matches()) { isSpecial = true; jmd_sbook_m.add(datas.get(i)); } if (!isSpecial) { jmd_sbook_n.add(datas.get(i)); } } //这里是投机取巧的方法,要求汉字必须在字母的上面,所以要先合并都为汉字的那一组 jmd_sbook.addAll(jmd_sbook_l); jmd_sbook.addAll(jmd_sbook_m); jmd_sbook.addAll(jmd_sbook_n); //拿到完整的数组以后,我们下面要进行字母排序,排序的方法网上都有,大家可以搜一搜 Collections.sort(jmd_sbook, new PinyinComparator()); mAdapter.setDatas(jmd_sbook); mListView.setAdapter(mAdapter);