Java: отсортировать массив строк в числовом виде - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть массив String, который содержит следующие записи:

Array[0] = "70% Marc"
Array[1] = "50% Marc"
Array[2] = "100% Marc"
Array[3] = "20% Marc"

И я бы хотел отсортировать этот массив по убыванию.Когда я использую Arrays.sort(Array), он сортирует его по убыванию, но 100% Marc находится внизу (потому что он просматривает только первый символ для сортировки).Я хочу, чтобы это было отсортировано так:

"100% Marc"
"70% Marc"
"50% Marc"
"20% Marc"

Как я могу это сделать?

Ответы [ 5 ]

4 голосов
/ 08 сентября 2011

Напишите свой CustomStringComparator и используйте его с методом сортировки.

public class CustomStringComparator implements Comparator<String>{

    @Override
    public int compare(String str1, String str2) {

       // extract numeric portion out of the string and convert them to int
       // and compare them, roughly something like this

       int num1 = Integer.parseInt(str1.substring(0, str1.indexOf("%") - 1));
       int num2 = Integer.parseInt(str2.substring(0, str2.indexOf("%") - 1));

       return num1 - num2;

    }
}
1 голос
/ 08 сентября 2011

Вам понадобится пользовательский компаратор:

import java.util.Comparator;

public class CustomComparator implements Comparator<String>{

    @Override
    public int compare(String firstString, String secondString) {
        int number1 = Integer.parseInt(firstString.substring(0, firstString.indexOf('%') - 1);
        int number2 = Integer.parseInt(secondString.substring(0, secondString.indexOf('%') - 1);
        return number1.compareTo(number2);
    }
}

Используйте этот компаратор с чем-то вроде этого:

List<String> entries = new ArrayList<String>();
entries.add("70% Marc");
entries.add("50% Marc");
entries.add("100% Marc");
entries.add("20% Marc");

CustomComparator comparator = new CustomComparator();
Collections.sort(entries, comparator);
1 голос
/ 08 сентября 2011

Вы должны использовать пользовательский Компаратор .В основном в вашем методе compare() вы напишете логику для порядка двух String s.

0 голосов
/ 08 сентября 2011

Это не смотрит на первый символ, это сортировка на основе строкового значения, поскольку это то, что у вас есть в вашем массиве.

Я бы предложил сохранить два поля,

Array [0,0] = 50;Array [0,1] = "Marc"

И затем сортировка по числовому полю, если вы придерживаетесь такого поведения.

0 голосов
/ 08 сентября 2011

Вам потребуется реализовать пользовательский Comparator<String>, который обрабатывает сравнение, удаляя знак процента:

public int compare(String str1, String str2) {
    Integer number1 = Integer.parseInt(str1.substring(0, str1.length - 1));
    Integer number2 = Integer.parseInt(str1.substring(0, str2.length - 1));
    return number1.compareTo(number2);
    // or use primitives, and then: return (x < y) ? -1 : ((x == y) ? 0 : 1);
    // but that's harder to read
}

Само сравнение можно выполнить с помощью оболочки Integer, кодаЯ вставил (взят из обертки) или гуавы Ints.compare(int1, int2)

Затем используйте Collections.sort(array, comparator)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...