Java-具有多个小数点的排序字符串

时间:2016-06-21 04:11:58

标签: java sorting hashmap comparator

我有一个"abc1.0","bcd1.1","xyz2.1.1","cdef1.2.1"... ,密钥是一个唯一的字符串,格式如下:

"abc1.0","bcd1.1","cdef1.2.1","xyz2.1.1",...

现在我需要使用该键对此hashmap进行排序,但是在数字顺序中按小数顺序排列:

Map<String, Integer> mp = new TreeMap<>(new Comparator<String>() {
    @Override
    public int compare(String key1, String key2) {
        .....
        //Counted decimal points and if > 2
        k1 = Integer.parseInt(key1.substring(1).split("\\.")[countOfDecimals]);
         //same for key2 
         ......
      } 
      return Double.compare(k1, k2);
}

我正在尝试使用树形图的比较器,但没有正确排序。

前:

string szDllPath = "12345";
size_t size = szDllPath.length();
TCHAR* wArr = new TCHAR[size];
for (size_t i = 0; i < size; ++i)
    wArr[i] = _T(szDllPath[i]);

cout<<szDllPath<<endl;
cout<<wArr<<endl;

修改

  • 小数点数为&#39; 4&#39;
  • 时的最大数量
  • 应按数字值排序,请忽略文字

几乎尝试了所有给出的例子是STO但没有成功:( 如果涉及两个或更多小数点,则不进行排序。请帮助!!

4 个答案:

答案 0 :(得分:2)

尝试使用正则表达式提取所有十进制数并对其进行排序:

Map<String, Integer> mp = new TreeMap<>(new Comparator<String>() {
        @Override
        public int compare(String a, String b) {
            return Double.compare(Double.valueOf(a.replaceAll("[^\\d+(?:\\.\\d+)?]","")), 
                    Double.valueOf(b.replaceAll("[^\\d+(?:\\.\\d+)?]","")));
        }
    });
    mp.put("abd10.9",6);
    mp.put("abd17.02",65);
    mp.put("nmbd1.02",17);
    mp.put("klbd7.028",10);
    mp.put("klbd7.023",9);

//升序

  

{nmbd1.020 = 17,klbd7.023 = 9,klbd7.028 = 10,abd10.9 = 6,abd17.02 = 65}

//以下评论中讨论的更改: //这只能在小数点长度相同的情况下才能工作,如果不是,那么应该添加零来填充剩余空间以便排序正常工作

 Map<String, Integer> mp = new TreeMap<>(new Comparator<String>() {
        @Override
        public int compare(String a, String b) {
            return Integer.compare(Integer.valueOf(a.replaceAll("\\D+","")),
                    Integer.valueOf(b.replaceAll("\\D+","")));
        }
    });
    mp.put("abd10.9.0.9",6);
    mp.put("gbd17.0.6.2",65);
    mp.put("nmbd2.0.9.2",17);
    mp.put("klbd7.0.2.7",10);
    mp.put("rlbd8.1.2.8",10);
    mp.put("opbd9.0.2.3",9);
    mp.put("mpbd7.0.3.2",9);
    mp.put("wpbd7.0.7.0",9);

输出:

  

{nmbd2.0.9.2 = 17,klbd7.0.2.7 = 10,mpbd7.0.3.2 = 9,wpbd7.0.7.0 = 9,rlbd8.1.2.8 = 10,opbd9.0.2.3 = 9,abd10.9.0.9 = 6,gbd17.0.6.2 = 65}

答案 1 :(得分:0)

尝试从键中的字符串中提取数字,并对树进行排序。当你最终有一个像“1.0”,“1.1”,“2.1.1”,“1.2.1”...

的列表

你按它们排序它会返回你期望的顺序:

“1.0”,“1.1”,“1.2.1”,“2.1.1”

答案 2 :(得分:0)

您需要对String进行标记 - 将其拆分为:

  • 文本
  • 版本( 1 .2.3)
  • 颠覆(1. 2 .3)
  • subsubversion(1.2。 3

然后使用字符串比较器比较文本,并迭代所有版本/颠覆,并使用整数比较来比较它们。

答案 3 :(得分:0)

您可以做的是从您要比较的键中提取字符串的数字部分:

例如,如果键是“abc1.5.02”和“zxy1.4.3”,那么数字部分是“1.5.02”和“1.4.3”

接下来,填充这些数字字符串的组件,使它们在每个颠覆中都有2位数。

即,

"1.5.02" --> "1.50.02.00.00" (add "00"s since you can have up to 4 decimal points)
"1.4.3"  --> "1.40.30.00.00"

接下来,将这两个转换为长。

"1.50.02.00.00" --> 150,020,000 (call this val1)
"1.40.30.00.00" --> 140,300,000 (call this val2)

最后,返回Long.compare(val1, val2)