在Java中用2位数字对数组进行排序

时间:2018-09-21 14:15:22

标签: java arrays sorting

我想对字符串数组进行排序,其中所有单元格均以1或2位数字开头,其余的均包含文本。
但是,只有Arrays.sort(myArray)与第一位数字相比才排序,所以我得到了:

1  - XXX
10 - XXX
12 - XXX
2  - XXX
24 - XXX

有人可以解决吗?

4 个答案:

答案 0 :(得分:3)

您需要为此提供自己的比较器。这是一个示例:

Arrays.sort(yourArray, new Comparator<String>() {
    @Override
    public int compare(String string1, String string2) {
        int number1 = Integer.decode(string1.substring(0, string1.indexOf(" "))); // This assumes that there is always a space after the number
        int number2 = Integer.decode(string2.substring(0, string2.indexOf(" ")));
        return Integer.compare(number1, number2);
    }
});

答案 1 :(得分:1)

Mischa提供了正确的答案,但是,有点有趣,它也可以工作:

Arrays.sort(arr, (s1, s2) -> 
{
  return (s1.charAt(1)-s2.charAt(1))*10 + s1.charAt(0)-s2.charAt(0);
});

答案 2 :(得分:0)

公共类SortArray {

public static void main(String[] args) {

    List<Digit> listDigit = new ArrayList<Digit>();

    Digit digit1 = new Digit(1, "XXX");
    Digit digit2 = new Digit(10, "XXX");
    Digit digit3 = new Digit(12, "XXX");
    Digit digit4 = new Digit(2, "XXX");
    Digit digit5 = new Digit(24, "XXX");

    listDigit.add(digit2);
    listDigit.add(digit3);
    listDigit.add(digit1);
    listDigit.add(digit4);
    listDigit.add(digit5);

    for (Digit digit : listDigit) {
            System.out.println("Sort Before -  Digit: "+digit.getDigit() +" Name:"+digit.getName());
    }

    System.out.println(" -------------------//-------------------------");

     Collections.sort(listDigit, new SortbyDigit()); 

    for (Digit digit : listDigit) {
            System.out.println("Sort After -  Digit: "+digit.getDigit() +" Name:"+digit.getName());
    }

}

公共类数字{

private final int digit;
private final String name;

public Digit(int digit, String name) {
    this.digit = digit;
    this.name = name;
}

public int getDigit() {
    return digit;
}

public String getName() {
    return name;
}

@Override
public int hashCode() {
    int hash = 7;
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final Digit other = (Digit) obj;
    if (this.digit != other.digit) {
        return false;
    }
    if (!Objects.equals(this.name, other.name)) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "Digit{" + "digit=" + digit + ", name=" + name + '}';
}

}

公共类SortbyDigit实现了Comparator {

 @Override
public int compare(Digit a, Digit b) 
{ 
    return a.getDigit() - b.getDigit(); 
} 

}

排序前-数字:10名称:XXX 之前排序-数字:12名称:XXX 之前排序-数字:1名称:XXX 之前排序-数字:2名称:XXX 之前排序-数字:24名称:XXX  ------------------- // ------------------------- 排序后-数字:1名称:XXX 排序后-数字:2名称:XXX 排序后-数字:10名称:XXX 排序后-数字:12名称:XXX 排序后-数字:24名称:XXX

答案 3 :(得分:-1)

您可以使用正则表达式在自定义压缩器中的字符串开头查找数字以进行排序。我选择使用正则表达式,因此数字的长度无关紧要,数字后面的数字也没有关系。如果两个字符串都以数字开头并且数字不相同 1 ,则比较数字,如果不只是将两个字符串作为一个整体进行比较。

Arrays.sort(array, (s1, s2) -> {
    Pattern pattern = Pattern.compile("^(\\d+)");

    Matcher matcher1 = pattern.matcher(s1);
    Matcher matcher2 = pattern.matcher(s2);

    if (matcher1.find() && matcher2.find()) {
        Integer i1 = Integer.valueOf(matcher1.group(1));
        Integer i2 = Integer.valueOf(matcher2.group(1));

        int compared = i1.compareTo(i2);
        if (compared != 0) {
            return compared;
        }
    }

    return s1.compareTo(s2);
});

对于您的示例数组,将输出:

1  - XXX
2  - XXX
10 - XXX
12 - XXX
24 - XXX

1:如果数字相同,您仍然可以比较整个字符串,以便数字之后的所有内容仍然可以排序。