Сортировать массив с 2 цифрами в Java - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу отсортировать строковый массив, в котором все ячейки начинаются с 1 или 2 цифр, остальные содержат текст.
Однако, только Arrays.sort(myArray) сортирует только по сравнению с первой цифрой, поэтому я получаю следующее:

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

У кого-нибудь есть решение?

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

открытый класс 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());
    }

}

открытый класс Digit {

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

0 голосов
/ 21 сентября 2018

Миша дал правильный ответ, но, как забавно, это тоже работает:

Arrays.sort(arr, (s1, s2) -> 
{
  return (s1.charAt(1)-s2.charAt(1))*10 + s1.charAt(0)-s2.charAt(0);
});
0 голосов
/ 21 сентября 2018

Вы можете использовать регулярное выражение, чтобы найти число в начале строки в пользовательском компакторе для сортировки.Я выбрал регулярное выражение, поэтому длина числа не имеет значения, и то, что следует за числом.Если обе строки начинаются с цифры и числа не совпадают 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: Если числа совпадают, вы все равно можете сравнить всю строку так, чтобы все после числа все равно было отсортировано.

0 голосов
/ 21 сентября 2018

Вы должны предоставить свой собственный компаратор для этого.Вот пример:

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);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...