0

我的输入 -

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

4 回答 4

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);
于 2013-10-04T10:25:36.937 回答
0

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

于 2013-10-04T10:26:43.677 回答
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

于 2013-10-04T10:29:12.197 回答
0

您需要使用此逻辑实现自己的比较器。

假设您所有的值都是 format 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())

于 2013-10-04T10:45:11.793 回答