Pinyin4j的基本用法,以及给城市名称选择排序,侧边栏字母排序,内有Pinyin4j的下载链接,这是对我发表的上一篇文章进行修改以及更新bug,上一篇文章排序有点bug,现在将bug修改好了

1.需要下载Pinyin4j的jar包。下载地址为https://sourceforge.net/projects/pinyin4j/files/
下载后需要放到安卓项目目录下的libs文件夹。如下图片所示
在这里插入图片描述
然后还需要依赖这个jar包。不会导包的Android Studio导入jar包或aar包看这个链接。https://blog.csdn.net/qq_36570506/article/details/128019219
基本用法:
通常情况下,只需要用到其中的PinyinHelper类中的静态方法toHanyuPinyinStringArray就可以了,比如:
String[] pinyinArray =PinyinHelper.toHanyuPinyinStringArray(‘单’);
for(int i = 0; i < pinyinArray.length; ++i)
{
System.out.println(pinyinArray[i]);
}
就会输出:
dan1
chan2
shan4
这三种发音,后面的数字代表第几声。可以看到静态方法toHanyuPinyinStringArray返回的数据类型是一个String数组,它用来接收一个汉字的多个发音,如果toHanyuPinyinStringArray中的参数不是汉字,那么它会返回null。
2.上面的第一步,只是为了给城市名称转换成拼音输出,好为了城市名称按首字母排序,有了第一步的拼音,只需要将拼音的字符串截取第一位字母即可排序。排序见MainActivity类对象里面

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.myapplication001.R.id;
import com.bumptech.glide.Glide;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class MainActivity extends AppCompatActivity  implements LetterSideBar.OnTouchLetterListener {

    private ImageView view;
    private TextView tv;

    private ListView listView;
    private LetterSideBar letterSideBar;
    private TextView textView;
    /**
     * 没有排序,旧的数据
     */
    private List<CityBean> mCities = new ArrayList();
    /**
     * 排序后的,新的数据
     */
    private List<CityBean> all_mCities = new ArrayList();
    private CityAdapter mAdapter;

    //----------------------------------------------------------------------------------------------
    //26个字母
    private List<CityBean> list_a = new ArrayList();
    private List<CityBean> list_b = new ArrayList();
    private List<CityBean> list_c = new ArrayList();
    private List<CityBean> list_d = new ArrayList();
    private List<CityBean> list_e = new ArrayList();
    private List<CityBean> list_f = new ArrayList();
    private List<CityBean> list_g = new ArrayList();
    private List<CityBean> list_h = new ArrayList();
    private List<CityBean> list_i = new ArrayList();
    private List<CityBean> list_j = new ArrayList();
    private List<CityBean> list_k = new ArrayList();
    private List<CityBean> list_l = new ArrayList();
    private List<CityBean> list_m = new ArrayList();
    private List<CityBean> list_n = new ArrayList();
    private List<CityBean> list_o = new ArrayList();
    private List<CityBean> list_p = new ArrayList();
    private List<CityBean> list_q = new ArrayList();
    private List<CityBean> list_r = new ArrayList();
    private List<CityBean> list_s = new ArrayList();
    private List<CityBean> list_t = new ArrayList();
    private List<CityBean> list_u = new ArrayList();
    private List<CityBean> list_v = new ArrayList();
    private List<CityBean> list_w = new ArrayList();
    private List<CityBean> list_x = new ArrayList();
    private List<CityBean> list_y = new ArrayList();
    private List<CityBean> list_z = new ArrayList();
    //----------------------------------------------------------------------------------------------
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.name);

        listView = (ListView) findViewById(R.id.id_lv_citysa);
        letterSideBar = (LetterSideBar) findViewById(R.id.id_ls_sidebara);
        textView = (TextView) findViewById(R.id.id_tv_maska);

     //   CityListActivity.startCityActivityForResult(MainActivity.this);


//        for (int i=0;i<6;i++){
//            CityBean cityBean13=new CityBean();
//            cityBean13.setId(0);
//            cityBean13.setName("v他素");
//            //   cityBean13.setPinyin("haikou");
//            cityBean13.setPinyin("v");
//            this.mCities.add(cityBean13);
//        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("青岛");
          //  cityBean0.setPinyin("qingdao");
      //      cityBean0.setPinyin("q");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean=new CityBean();
            cityBean.setId(i);
            cityBean.setName("佛山");
         //   cityBean.setPinyin("foshan");
         //   cityBean.setPinyin("f");
            this.mCities.add(cityBean);
        }

//        for (int i=0;i<6;i++){
//            CityBean cityBean0=new CityBean();
//            cityBean0.setId(0);
//            cityBean0.setName("U型管");
//        //    cityBean0.setPinyin("uxingguan");
//            cityBean0.setPinyin("u");
//            this.mCities.add(cityBean0);
//        }

//        for (int i=0;i<6;i++){
//            CityBean cityBean0=new CityBean();
//            cityBean0.setId(0);
//            cityBean0.setName("id");
//          //  cityBean0.setPinyin("id");
//            cityBean0.setPinyin("i");
//            this.mCities.add(cityBean0);
//        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("北京");
          //  cityBean0.setPinyin("beijing");
        //    cityBean0.setPinyin("b");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("日本");
        //    cityBean0.setPinyin("riben");
        //    cityBean0.setPinyin("r");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("草本植物");
          //  cityBean0.setPinyin("caobenzhiwu");
       //     cityBean0.setPinyin("c");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("台湾");
         //   cityBean0.setPinyin("taiwan");
       //     cityBean0.setPinyin("t");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("峨眉山");
       //     cityBean0.setPinyin("emeishan");
         //   cityBean0.setPinyin("e");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("江门");
          //  cityBean0.setPinyin("jiangmen");
        //    cityBean0.setPinyin("j");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("昆明");
         //   cityBean0.setPinyin("kunming");
         //   cityBean0.setPinyin("k");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("兰州");
          //  cityBean0.setPinyin("lanzhou");
         //   cityBean0.setPinyin("l");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("茂名");
         //   cityBean0.setPinyin("maoming");
        //    cityBean0.setPinyin("m");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("南京");
         //   cityBean0.setPinyin("nanjing");
        //    cityBean0.setPinyin("n");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("欧洲");
         //   cityBean0.setPinyin("ouzhou");
         //   cityBean0.setPinyin("o");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean0=new CityBean();
            cityBean0.setId(0);
            cityBean0.setName("判断");
         //   cityBean0.setPinyin("panyu");
         //   cityBean0.setPinyin("p");
            this.mCities.add(cityBean0);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean1=new CityBean();
            cityBean1.setId(0);
            cityBean1.setName("暗凯");
         //   cityBean1.setPinyin("ankai");
        //    cityBean1.setPinyin("a");
            this.mCities.add(cityBean1);

        }

        for (int i=0;i<6;i++){
            CityBean cityBean12=new CityBean();
            cityBean12.setId(0);
            cityBean12.setName("德州");
        //    cityBean12.setPinyin("dezhou");
          //  cityBean12.setPinyin("d");
            this.mCities.add(cityBean12);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean13=new CityBean();
            cityBean13.setId(0);
            cityBean13.setName("海口");
         //   cityBean13.setPinyin("haikou");
        //    cityBean13.setPinyin("h");
            this.mCities.add(cityBean13);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean14=new CityBean();
            cityBean14.setId(0);
            cityBean14.setName("烟台");
        //    cityBean14.setPinyin("yantai");
        //    cityBean14.setPinyin("y");
            this.mCities.add(cityBean14);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean15=new CityBean();
            cityBean15.setId(0);
            cityBean15.setName("张家口");
         //   cityBean15.setPinyin("zhangjiakou");
          //  cityBean15.setPinyin("z");
            this.mCities.add(cityBean15);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean16=new CityBean();
            cityBean16.setId(0);
            cityBean16.setName("瞎子");
         //   cityBean16.setPinyin("xiamen");
         //   cityBean16.setPinyin("x");
            this.mCities.add(cityBean16);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean17=new CityBean();
            cityBean17.setId(0);
            cityBean17.setName("文山");
         //   cityBean17.setPinyin("wenshan");
        //    cityBean17.setPinyin("w");
            this.mCities.add(cityBean17);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean18=new CityBean();
            cityBean18.setId(0);
            cityBean18.setName("三亚");
        //    cityBean18.setPinyin("sanya");
         //   cityBean18.setPinyin("s");
            this.mCities.add(cityBean18);
        }

        for (int i=0;i<6;i++){
            CityBean cityBean=new CityBean();
            cityBean.setId(i);
            cityBean.setName("广州");
          //  cityBean.setPinyin("guangzhou");
         //   cityBean.setPinyin("g");
            this.mCities.add(cityBean);
        }

        //------------------------------------------------------------------------------------------
        //在这里给城市名称设置拼音
        Log.v("拼音输出2",  "打印 all_mCities.size()="+mCities.size());
        for(int i = 0; i < mCities.size(); ++i)
        {     /**
         * 得到多个拼音数组,多音字
         */
            String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(mCities.get(i).getName().charAt(0));//只要城市名称的第一个字
            //   Log.v("拼音输出2",  "打印数组大小 "+pinyinArray.length);
            Log.v("拼音输出2",  "只要打印拼音1 "+pinyinArray[0].charAt(0));//这里只要多音字数组中的第一个,并且只要拼音字符串里的第一个字母

            //给城市名称列表设置拼音,只要拼音字符串里的第一个字母
            mCities.get(i).setPinyin(pinyinArray[0].charAt(0)+"");
        }
        //------------------------------------------------------------------------------------------

        //----------------------------------------------------------------------------------------
        //在这里排序     总共有这么多数据
        for(int i=0;i<mCities.size();i++){

            switch (mCities.get(i).getPinyin()){
                case "a" :
                    list_a.add(mCities.get(i));
                    break;
                case "b" :
                    list_b.add(mCities.get(i));
                    break;
                case "c" :
                    list_c.add(mCities.get(i));
                    break;
                case "d" :
                    list_d.add(mCities.get(i));
                    break;
                case "e" :
                    list_e.add(mCities.get(i));
                    break;
                case "f" :
                    list_f.add(mCities.get(i));
                    break;
                case "g" :
                    list_g.add(mCities.get(i));
                    break;
                case "h" :
                    list_h.add(mCities.get(i));
                    break;
                case "i" :
                    list_i.add(mCities.get(i));
                    break;
                case "j" :
                    list_j.add(mCities.get(i));
                    break;
                case "k" :
                    list_k.add(mCities.get(i));
                    break;
                case "l" :
                    list_l.add(mCities.get(i));
                    break;
                case "m" :
                    list_m.add(mCities.get(i));
                    break;
                case "n" :
                    list_n.add(mCities.get(i));
                    break;
                case "o" :
                    list_o.add(mCities.get(i));
                    break;
                case "p" :
                    list_p.add(mCities.get(i));
                    break;
                case "q" :
                    list_q.add(mCities.get(i));
                    break;
                case "r" :
                    list_r.add(mCities.get(i));
                    break;
                case "s" :
                    list_s.add(mCities.get(i));
                    break;
                case "t" :
                    list_t.add(mCities.get(i));
                    break;
                case "u" :
                    list_u.add(mCities.get(i));
                    break;
                case "v" :
                    list_v.add(mCities.get(i));
                    break;
                case "w" :
                    list_w.add(mCities.get(i));
                    break;
                case "x" :
                    list_x.add(mCities.get(i));
                    break;
                case "y" :
                    list_y.add(mCities.get(i));
                    break;
                case "z" :
                    list_z.add(mCities.get(i));
                    break;
            }
        }
        all_mCities.addAll(list_a);
        all_mCities.addAll(list_b);
        all_mCities.addAll(list_c);
        all_mCities.addAll(list_d);
        all_mCities.addAll(list_e);
        all_mCities.addAll(list_f);
        all_mCities.addAll(list_g);
        all_mCities.addAll(list_h);
        all_mCities.addAll(list_i);
        all_mCities.addAll(list_j);
        all_mCities.addAll(list_k);
        all_mCities.addAll(list_l);
        all_mCities.addAll(list_m);
        all_mCities.addAll(list_n);
        all_mCities.addAll(list_o);
        all_mCities.addAll(list_p);
        all_mCities.addAll(list_q);
        all_mCities.addAll(list_r);
        all_mCities.addAll(list_s);
        all_mCities.addAll(list_t);
        all_mCities.addAll(list_u);
        all_mCities.addAll(list_v);
        all_mCities.addAll(list_w);
        all_mCities.addAll(list_x);
        all_mCities.addAll(list_y);
        all_mCities.addAll(list_z);

        //---------------------------------------------------------------------------------------

        this.mAdapter = new CityAdapter(this, this.all_mCities);
        this.listView.setAdapter(this.mAdapter);

        this.letterSideBar.setOverLayTextView(this.textView);
        this.letterSideBar.setOnTouchLetterListener(this);
        //城市列表点击事件监听
        this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CityBean bean = (CityBean)mAdapter.getItem(position);
                tv.setText(bean.getName());
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 101&& resultCode ==102){
            String city = data.getStringExtra("city");
            tv.setText(city);
        }
    }

    /**
     * 这个方法是用来与listview城市列表通信的,侧边栏的字母与城市列表字母一一对应
     * @param letter
     */
    public void onLetterSelected(String letter) {
        int position = this.mAdapter.getPosition(letter);
        if (position != -1) {
            Log.v("LOG我在这里啊",  "走到这里  position != -1 "+position);

            this.listView.setSelection(position);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值