Мне нужно отсортировать имена на основе шаблона Regex, как я могу это сделать? - PullRequest
1 голос
/ 08 декабря 2011

Мне нужно отсортировать имена. и эти имена иногда статистика с номером и как я могу сделать, чтобы отсортировать по номеру, если имя имеет, а если нет. В настоящее время я сортирую только алфавиты.

Ex: 3.Animal
    1.Box
    4.Monkey
    2.Tiger

Но мне нужно отобразить выше, как показано ниже.

1.Box
2.Tiger
3.Animal
4.Monkey

Нужно ли мне регулярное выражение, и если да, то что мне нужно RE?

если нет, как мне поступить в Java.

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 08 декабря 2011

Регулярное выражение, безусловно, кажется разумным первым шагом.Вы знаете о Comparator ?Он определяет метод int compare(T one, T two), который имеет обычную семантику int-as-сравнение-результат.Если у вас есть экземпляр Comparator, вы можете передать его методам сортировки, таким как Collections.sort.

Итак, один из подходов - написать Comparator<String>, метод compare которого использует регулярное выражениечтобы извлечь две части числа строк, а затем делает числовое сравнение.Проблема в том, что вы будете выполнять этот анализ каждый раз, когда смотрите на каждую строку, что может стоить дорого.

Альтернативой может быть создание TreeMap<Integer,String> и вставка пар ключ-значение, гдеключ - это проанализированный int, а значение - исходная строка.Затем вы можете просто перебрать набор значений, и они будут отображаться в ключевом порядке.Вероятно, это был бы подход, который я выбрал бы.

EDIT yytg поднимает хороший вопрос, который заключается в том, что для такого простого разбора, вы бы точно так же хорошо разбили на "\\." (с ограничением 2) и разбор левой стороны.Вы также можете использовать String.indexOf, чтобы найти точку, а затем String.substring, чтобы получить часть строки слева от точки.

1 голос
/ 08 декабря 2011

Парень из Comparator верен, MalTec близок, но может опрокинуться на "11.Liger" или где-нибудь в нольUBER STRING SORTER IS ...

public static void main( String[] args ) {
    List<String> theStrings = Arrays.asList( new String[] {
            "3.Animal",
            "1.Box",
            "4.Monkey",
            "2.Tiger",
            "11.Panzerkampfwagen",
            null,
            null,
            "127.0.0.1" } );
    Collections.sort( theStrings, new Comparator<String>() {
        Pattern pattern = Pattern.compile( "(\\d+).*" );

        @Override
        public int compare( String s1, String s2 ) {
            if ( s1 == null && s2 == null ) {
                return 0;
            } else if ( s1 != null && s2 == null ) {
                return -1;
            } else if ( s1 == null && s2 != null ) {
                return 1;
            } else {
                Matcher s1Matcher = pattern.matcher( s1 );
                Matcher s2Matcher = pattern.matcher( s2 );
                if ( !s1Matcher.matches() && !s2Matcher.matches() ) {
                    return s1.compareTo( s2 );
                } else if ( s1Matcher.matches() && !s2Matcher.matches() ) {
                    return -1;
                } else if ( !s1Matcher.matches() && s2Matcher.matches() ) {
                    return 1;
                } else {
                    int i1 = Integer.parseInt( s1Matcher.group( 1 ) );
                    int i2 = Integer.parseInt( s2Matcher.group( 1 ) );
                    return i1 - i2;
                }
            }
        }

    } );
    System.out.println( theStrings );
}

вывод составляет

[1.Box, 2.Tiger, 3.Animal, 4.Monkey, 11.Panzerkampfwagen, 127.0.0.1, null, null]
0 голосов
/ 08 декабря 2011

если есть. форма, в фиксированной для всех записей, следующий код должен работать для вас .. нет необходимости в регулярных выражениях .. И да, надеюсь, это не какой-то учебник, который вы спросили здесь

String[] source={"3.Animal","1.Box","4.Monkey","2.Tiger"};


Arrays.sort(source, new Comparator<String>() {
  @Override
  public int compare(String s1, String s2) {

      // to the start of the other, or else throwing an exception)
       if ((s1.indexOf('.') == -1) || (s2.indexOf('.') == -1)) { // both or neither
                return 0;
        }
        return s1.compareTo(s2);
   }
});


for(int i=0;i<source.length;i++){
    System.out.println("String - "+i+" : "+source[i]);
}
0 голосов
/ 08 декабря 2011

Вы можете использовать собственный 'Comparator' - смотрите здесь - нет необходимости в регулярном выражении - вы можете разбить строку на '.'а затем возьмите левую сторону и конвертируйте ее в число

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