2010-03-04 252 views
3

我有一个数组,我需要按照出现次序按字母排序其元素。 例如:按字母顺序排列数组

55 The 
32 ASomething 
32 BSomething 

ASomething should come before Bsomething because: 
1) they have the same number 
2) A comes before B alphabetically 

所以,你的排序首先出现的号码,然后按字母顺序

什么是做到这一点的最好办法。 我正在使用合并排序来排序的计数,但我怎么会把它将检查,如果他们有相同的号码,它按字母顺序排序(可能超过2个单词)的声明。

SOLUTION:我所做的是在之前我做了数据的计数合并排序,那就是不够好:)谢谢大家的帮助

+0

这不影响您如何处理计数,但是您的排序是否区分大小写或不区分大小写? – shoover 2010-03-04 00:49:05

+0

我的第一个想法是,哇,这在bash shell中会很容易。 :) – shoover 2010-03-04 00:49:23

+0

shoover:我使用java :) – user220755 2010-03-04 00:59:05

回答

4

你需要一个定制Comparator该数据合并排序使用Arrays.sort()

Arrays.sort(array, new CustomComparator()); 

public class CustomComparator implements Comparator<String> { 
    private final Pattern pattern = Pattern.compile("(\\d+)\\s+(.*)"); 

    public int compare(String s1, String s2) { 
    Matcher m1 = pattern.matcher(s1); 
    if (!m1.matches()) { 
     throw new IllegalArgumentException("s1 doesn't match: " + s1); 
    } 
    Matcher m2 = pattern.matcher(s2); 
    if (!m2.matches()) { 
     throw new IllegalArgumentException("s2 doesn't match: " + s2); 
    } 
    int i1 = Integer.parseInt(m1.group(1)); 
    int i2 = Integer.parseInt(m2.group(1)); 
    if (i1 < i2) { 
     return 1; 
    } else if (i1 > i2) { 
     return -1; 
    } 
    return m1.group(2).compareTo(m2.group(2)); 
    } 
} 

对于Collections可以使用Collections.sort()

以上假设你的数组元素是String就像而不是包含事件和一些文本的特定数据结构。如果是这种情况,您可以使用更简单的Comparator

此外,如果您确实有一个String的数组,它可能值得首先将其转换为已解析的对象数组以解救元素(即一些元素将被多次解析)。

0

您应该确保排序算法使用的是保证“稳定”一样java.util.Collections.sort

此排序被保证是稳定的:等于元素将无法重新排序作为排序的结果。

你没有提到你正在使用哪种数据结构,这肯定会指导你的方法。例如,您可以使用Map>来为数据建模,在这种情况下,对列表排序然后遍历Map的排序键是有意义的。这不需要自定义比较器。

+0

为什么你认为OP需要*稳定*排序? – 2010-03-04 07:49:41

+0

因为OP有两次排序“所以你先排序的次数然后按字母排序” – msw 2010-03-04 15:59:27