按编号对列表排序

时间:2013-10-04 10:23:47

标签: java list sorting

我的输入 -

List<String> parameterNames => [value0, type1, type0, name1, value1, name0]

我使用Collections.Sort

Collections.sort(parameterNames)

我得到了这样的答案

[name0, name1, type0, type1, value0, value1]

我想排序并获得这样的列表

[name0,type0,value0,name1,type1,value1]

我能用Java做到这一点吗?

4 个答案:

答案 0 :(得分:8)

编写自定义Comparator,并将其实例传递给sort方法:

Comparator<String> myComparator = new Comparator<String>() {
    public int compare(String str1, String str2) {
        // get the number at the end, and compare on the basis of that number
        // And then do the string comparison on substring before number
    }
};

Collections.sort(parameterNames, myComparator);

答案 1 :(得分:0)

当您使用Collections.sort()时,您可以传递Comparator来实现自定义方法,以检查搜索顺序中哪些更高,哪些更低。

答案 2 :(得分:0)

最好使用自定义Comparator界面。如果您在使用Comparator时遇到问题,请尝试使用以下代码:

    List<String> revList= new ArrayList<>();
    List<String> parameterNames=..//[value0, type1, type0, name1, value1, name0]
    for (String string : parameterNames) {
        revList.add(new StringBuilder(string).reverse().toString());//reverse the word
    }
    Collections.sort(revList);// Sort reverse word.

    for (String string : revList) {
        System.out.println(new StringBuilder(string).reverse().toString());
        // Again reverse to get desired output.
    }

输出: name0,type0,value0,name1,type1,value1

答案 3 :(得分:0)

您需要使用此逻辑实现自己的Comparator

假设您的所有值都是stringNUMBER格式,这里有一个实现镜头:

/**
 * Compares two {@link String}s of the format stringNUMBER. Assumption: There is a single numeric     part to the string,
 * always at the end.
 */
public class TrailingNumberComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        int cmp = o1.substring(getStrartNumberIndex(o1)).compareTo(o2.substring(getStrartNumberIndex(o2)));
        if (cmp != 0) {
            return cmp;
        }
        return o1.compareTo(o2);
    }

    private static int getStrartNumberIndex(String s) {
        for (int i = 0; i < s.length(); ++i) {
            if (Character.isDigit(s.charAt(i))) {
                return i;
            }
        }
        return s.length();
    }
}

然后,您就可以致电Collections.sort(parameterNames, new TrailingNumberComparator());