zoukankan      html  css  js  c++  java
  • java字符串排序(数字,字母,汉字等组合排序)

    package cn.cnnho.backstage.utils;

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.stream.Collectors;

    import cn.cnnho.backstage.test.User;
    import cn.cnnho.backstage.vo.file.OriginalFileModel;

    public class StringComparatorUtils implements Comparator<User>{
    private String str1, str2;
    private int pos1, pos2, len1, len2;

    public int compare(Users1, Users2)
    {
    str1 = s1.getName();
    str2 = s2.getName();
    len1 = str1.length();
    len2 = str2.length();
    pos1 = pos2 = 0;

    int result = 0;
    while (result == 0 && pos1 < len1 && pos2 < len2)
    {
    char ch1 = str1.charAt(pos1);
    char ch2 = str2.charAt(pos2);

    if (Character.isDigit(ch1))
    {
    result = Character.isDigit(ch2) ? compareNumbers() : -1;
    }
    else if (Character.isLetter(ch1))
    {
    result = Character.isLetter(ch2) ? compareOther(true) : 1;
    }
    else
    {
    result = Character.isDigit(ch2) ? 1
    : Character.isLetter(ch2) ? -1
    : compareOther(false);
    }

    pos1++;
    pos2++;
    }

    return result == 0 ? len1 - len2 : result;
    }

    private int compareNumbers()
    {
    int end1 = pos1 + 1;
    while (end1 < len1 && Character.isDigit(str1.charAt(end1)))
    {
    end1++;
    }
    int fullLen1 = end1 - pos1;
    while (pos1 < end1 && str1.charAt(pos1) == '0')
    {
    pos1++;
    }

    int end2 = pos2 + 1;
    while (end2 < len2 && Character.isDigit(str2.charAt(end2)))
    {
    end2++;
    }
    int fullLen2 = end2 - pos2;
    while (pos2 < end2 && str2.charAt(pos2) == '0')
    {
    pos2++;
    }

    int delta = (end1 - pos1) - (end2 - pos2);
    if (delta != 0)
    {
    return delta;
    }

    while (pos1 < end1 && pos2 < end2)
    {
    delta = str1.charAt(pos1++) - str2.charAt(pos2++);
    if (delta != 0)
    {
    return delta;
    }
    }

    pos1--;
    pos2--;

    return fullLen2 - fullLen1;
    }

    private int compareOther(boolean isLetters)
    {
    char ch1 = str1.charAt(pos1);
    char ch2 = str2.charAt(pos2);

    if (ch1 == ch2)
    {
    return 0;
    }

    if (isLetters)
    {
    ch1 = Character.toUpperCase(ch1);
    ch2 = Character.toUpperCase(ch2);
    if (ch1 != ch2)
    {
    ch1 = Character.toLowerCase(ch1);
    ch2 = Character.toLowerCase(ch2);
    }
    }
    return ch1 - ch2;
    }
    public static void main(String[] args) {
    //list集合
    // List<User> list = new ArrayList<User>();
    // User user = new User();
    // user.setName("1.jpg");
    // user.setAge("12");
    // User user1 = new User();
    // user1.setName("10.jpg");
    // user1.setAge("13");
    // User user2 = new User();
    // user2.setName("2.jpg");
    // user2.setAge("14");
    // User user3 = new User();
    // user3.setName("2a2.jpg");
    // user3.setAge("15");
    // list.add(user);
    // list.add(user1);
    // list.add(user2);
    // list.add(user3);
    // List<User> result = list.stream().sorted(new StringComparatorUtils()).collect(Collectors.toList());
    //
    //
    // Collections.sort(list,new StringComparatorUtils());
    // for(int i = 0;i < result.size();i++){
    // System.out.println(result.get(i).getName().toString());
    // }
    //数组
    // String arr[] = {"1.jpg", "12.jpg", "10.jpg", "2.jpg", "2abc.jpg","a2bc.jpg","a1bc.jpg"};
    //
    // Arrays.sort(arr, new StringComparatorUtils());
    // for(int i=0;i<arr.length;i++){
    // System.out.println(arr[i]);
    // }
    }


    }

  • 相关阅读:
    【bzoj2653】【middle】【主席树+二分答案】
    Codeforces 464E. The Classic Problem
    关于主席树的入门,讲解和题单
    BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)
    [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)
    1018_两个圆相交的面积
    String对象中常用的方法
    张爱玲写的信
    React Native拆包及热更新方案 · Solartisan
    vue项目实战
  • 原文地址:https://www.cnblogs.com/guangxiang/p/11593227.html
Copyright © 2011-2022 走看看