java中如何更改优先级排序中

问题描述 投票:0回答:2

我知道,使用内置的方法,如Collections.sort,使用coparator和可比接口ASCII排序很容易在Java中,但我想知道的是有标准的字母顺序排序的任何简单的方法

使用ASCII排序输出将是: “2012010”, “2012011”, “2012012”, “201201A” 使用标准的字母顺序输出将是: “201201A”, “2012010”, “2012011”, “2012012”,

我想知道的是有远在Java中使用相当或比较接口获得这个标准字母排序

下面的程序提供ASCII排序,但我想标准的字母顺序

 public class AlphabeticalSort {

    public static void main(String args[]) throws NoSuchFieldException, SecurityException{
        String[] words = { "2012010", "2012012", "2012011", "201201A" };

        for (int i = 0; i < 4; ++i) {
            for (int j = i + 1; j < 4; ++j) {
                if (words[i].compareTo(words[j]) > 0) {

                    String temp = words[i];
                    words[i] = words[j];
                    words[j] = temp;
                }
            }
        }

        System.out.println("In lexicographical order:");
        for (int i = 0; i < 4; i++) {
            System.out.println(words[i]);
        }
    }

}
java collections
2个回答
1
投票

你可以使用这样的比较:

public final static Comparator<String> STANDARD_ALPHABETICAL_ORDER =
    (a,b) -> {
        int na = a.length();
        int nb = b.length();
        int r;
        int n;
        if (na < nb) {
            r = -1;
            n = na;
        } else if (na > nb) {
            r = -1;
            n = nb;
        } else {
            r = 0;
            n = na;
        }
        for (int i = 0; i < n; ++i) {
            char ca = a.charAt(i);
            char cb = b.charAt(i);
            if (ca != cb) {
                if (Character.isDigit(ca) && !Character.isDigit(cb)) {
                    return 1;
                } else if (!Character.isDigit(ca) && Character.isDigit(cb)) {
                    return -1;
                } else if (ca < cb) {
                    return -1;
                } else {
                    return 1;
                }
            }
        }
        return r;
    };

然后用它来整理你的数组:

    String[] words = { "2012010", "2012012", "2012011", "201201A" };
    Arrays.sort(words, STANDARD_ALPHABETICAL_ORDER);
    System.out.println("In lexicographical order:");
    for (int i = 0; i < 4; i++) {
        System.out.println(words[i]);
    }

0
投票

你可以像这样的代码

封装测试;

java.util.Arrays中的进口;进口的java.util.Comparator;

公共类AlphabeticalSort {

public static void main(String args[]) throws NoSuchFieldException,
        SecurityException {
    String[] words = { "2012010", "2012012", "2012011", "2012011A","2012011B" };

    Arrays.sort(words, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {

            int result=0;
            if (isNumber(o1) && isNumber(o2)) {
                result= Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
            } else if (!isNumber(o1) && isNumber(o2)) {
                Integer o1num = Integer.valueOf(o1.replaceAll("[^-?0-9]+",
                        ""));

                if (o1num == Integer.valueOf(o2)) {
                    result= -1;
                } else {
                    result= o1num.compareTo(Integer.valueOf(o2));
                }
            } else if (!isNumber(o2) && isNumber(o1)) {
                Integer o1num = Integer.valueOf(o2.replaceAll("[^-?0-9]+",
                        ""));
                if (o1num == Integer.valueOf(o1)) {
                    result= +1;
                } else {
                    result= o1num.compareTo(Integer.valueOf(o1));
                }
            } else {
                result= o1.compareTo(o2);
            }

            System.out.println("o1="+o1+"  o2="+o2+" result= "+result);
            return result;
        }
    });
    System.out.println("In lexicographical order:");
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }

}

public static boolean isNumber(String val) {
    boolean isNumber = false;

    try {
        Integer.parseInt(val);
        isNumber = true;
    } catch (NumberFormatException e) {
        // e.printStackTrace();
    }

    return isNumber;
}

}

© www.soinside.com 2019 - 2024. All rights reserved.