A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© whs_nk 中级黑马   /  2013-3-12 22:13  /  2416 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 whs_nk 于 2013-3-13 18:32 编辑

看视频排序时老是英文字符串排序,突然想到这样一个问题:对十以内形如{"二","三","一","四"}的中文数字字符串序列进行排序,要求排序后为一二三四
闲着的时候写了下面这个比较粗糙的思想及对应的代码。想知道其他方法,大家练练手哦

/*
要求:对十以内形如{"二","三","一","四"}的中文数字字符串序列进行排序,要求排序后为一二三四

算法思想:
1、创建表 String[] table = {"一","二","三","四","五","六","七","八","九","十",};
2、根据所给字符串数组strArr查表table,并用整型数组sbd[10]存储给定字符串数组strArr
中的元素在表中对应的脚标。
3、对sbd[10]中的元素进行排序,排序后传递给整型数组aa,再根据aa中的元素(即排好序后的脚标)
查table表,将对应的元素存入StringBuilder sbd中(或进一步String str = sbd.toString();),最后打印。
*/

class ChNumSort
{
   public static void main(String[] args)
   {
      String[] strArr = {"二","三","一","四"};
      chNumSort(strArr);
   }

public static void chNumSort(String[] str)
{
     String[] table = {"一","二","三","四",
      "五","六","七","八","九","十",};
  
     int[] sbd = new int[10];
  
    /*查找中文序列str所对应的表中的脚标,存入sbd中
     并返回sbd数组的实际存储长度k*/
     int k = findIndex(table,str,sbd);

     int len = str.length;
     int[] aa = sortIndex(sbd,k);//接收排序后的值为脚标的数组
     sortCh(aa,len,table);
}

public static int findIndex(String[] table,String str[],int[] sbd)
{
     /*查找中文序列str所对应的表中的脚标,存入sbd中
      并返回sbd数组的实际存储长度k
     */
     int len = str.length;
     int k = 0;

     for (int i=0;i<len ;i++)
       for (int j=0;j<10 ;j++ )
         if(table[j].compareTo(str)==0)
             sbd[k++]=j;  
     return k;
}

public static int[] sortIndex(int[] str,int len)
{
  
     //对长度为len的存储脚标的数组str进行排序

     for (int i=0;i<len-1 ;i++ )
     {
       int flag = i;//用于标记每次循环比较时最小字符串的脚标
       int temp = -1;

       for (int j=i+1;j<len ;j++ )
           if(str[flag]>str[j])//求小值
                flag=j;

      if(flag!=i)
      {
         temp = str;
         str=str[flag];
         str[flag]=temp;
      }
    }

    return str;
}

public static void sortCh(int[] aa,int len,String[] strArr)
  {
    /*根据排好序的脚标数组aa查表,将strArr表中脚标为aa的字符串
    存入到StringBuilder sbd之中,再将其转换成字符串str打印输出
    */
    StringBuilder sbd = new StringBuilder();

    for (int i=0;i<len ;i++)
    sbd.append(strArr[aa]);
    //String str = sbd.toString();

    System.out.println(sbd);
  }
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
昨晚复习集合框架时想到的一个方法。各位大神,给点意见哦{:soso_e183:}
  1. //方法二:根据TreeMap自身的自然排序
  2. import java.util.*;
  3. class TreeMapChSort
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 String[] strArr = {"二","三","二","四"};
  8.                 chNumSort(strArr);
  9.         }

  10.         public static void chNumSort(String[] str)
  11.         {
  12.                 String[] table = {"一","二","三","四","五","六","七","八","九","十",};

  13.                 TreeMap<Integer,String> tm = new TreeMap<Integer,String>(new KeyCom());

  14.                 int len = str.length;//获取字符串数组长度

  15.                 for (int i=0;i<len ;i++)
  16.                         for (int j=0;j<10 ;j++ )
  17.                                 if(table[j].compareTo(str[i])==0)
  18.                                         tm.put(j,str[i]);//将str中各元素添加进tm集合中
  19.                        
  20.                 Set<Map.Entry<Integer,String>> entryset = tm.entrySet();
  21.                
  22.                 StringBuilder sbd = new StringBuilder();

  23.                 //获取tm的Set视图,考虑到无需修改集合元素,采用for循环取值
  24.                 for(Map.Entry<Integer,String> tag : entryset)
  25.                         sbd.append(tag.getValue());
  26.                
  27.                 System.out.println(sbd);
  28.         }
  29. }

  30. class KeyCom implements Comparator<Integer>//构造比较器以对重复元素进行比较
  31. {
  32.         public int compare(Integer num1,Integer num2)
  33.         {
  34.                 return (num1>=num2)? 1:-1;
  35.         }
  36. }
复制代码
回复 使用道具 举报
还是把它改成“已解决”好了{:soso_e141:}
回复 使用道具 举报
本帖最后由 杨杨 于 2013-3-13 19:29 编辑

以前的时候用到这知识点 搜的一段代码 希望对你有帮助
  1. import java.text.Collator;
  2. import java.util.Locale;
  3. import java.util.Set;
  4. import java.util.TreeSet;

  5. public class Test {
  6.     public static void main(String[] args){
  7.         Collator collator = Collator.getInstance(Locale.CHINA);
  8.         Set<String> words = new TreeSet<String>(collator);
  9.         words.add("一");
  10.         words.add("十");
  11.         words.add("四");
  12.         words.add("八");
  13.         words.add("c");
  14.         words.add("b");
  15.         words.add("a");
  16.         for (String word : words) {
  17.             System.out.println(word);
  18.         }
  19.     }
  20. }

  21. 我测试了一下是按照拼音排序的实在抱歉
复制代码
回复 使用道具 举报
谢谢了哈,回帖是一种精神,传说是这样的{:soso_e113:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马