Сортировка без учета пунктуации (Java)

Я пытаюсь отсортировать объект Android ListView. В настоящее время я использую следующий код:

  // Sort terms alphabetically, ignoring case
  adapter.sort(new Comparator<String>() {
        public int compare(String object1, String object2) {
            return object1.compareToIgnoreCase(object2);
        };

Это сортирует мой список, игнорируя регистр. Тем не менее, было бы неплохо игнорировать и пунктуацию. Например:

c.a.t.
car
cat

следует отсортировать следующим образом:

car
c.a.t.
cat

(На самом деле не имеет значения, какая из двух кошек (кошка или кошка) будет первой, если они расположены рядом друг с другом).

Есть ли простой способ обойти это? Я предполагаю, что решение будет включать в себя извлечение ТОЛЬКО буквенно-цифровых символов из строк, затем их сравнение, а затем возвращение их в прежнее состояние с включением снова небуквенно-цифровых символов.


person CaptainProg    schedule 12.09.2012    source источник


Ответы (2)


При сравнении удаляйте ненужные символы

public int compare(String str1, String str2) {
    String remove = "[\\.:',]"; // change this to all to characters to remoce
    return str1.replaceAll(remove, "").compareToIgnoreCase(object2.replaceAll(remove, ""));
};
person Juan Mendes    schedule 12.09.2012
comment
+1 за строку удаления. Для меня решение Baz сработало, поскольку оно не использует replaceAll. Не знаю, почему replaceAll не работает, но мне нравится идея удаления символов в строке. Ваше здоровье - person CaptainProg; 13.09.2012
comment
Хорошо, теперь ваше решение работает лучше! Это немного увеличивает время загрузки, и на практике я буду использовать метод База (для моего конкретного приложения я бы выбрал удаление только одного символа во время загрузки), но ваш ответ отвечает на мой вопрос для нескольких типов пунктуации. . - person CaptainProg; 13.09.2012

Это должно сделать это:

return object1.replace(".", "").compareToIgnoreCase(object2.replace(".", ""));

Я не думаю, что есть более простой способ.

person Baz    schedule 12.09.2012
comment
Это работает, если единственным знаком препинания является точка. Вы не можете использовать метод String.replace для замены нескольких символов, но вы можете использовать String.replaceAll - person Juan Mendes; 13.09.2012
comment
@JuanMendes Спасибо, я знаю об этом. - person Baz; 13.09.2012
comment
В примере OP показана точка. Но вопрос говорит о знаках препинания. - person Juan Mendes; 13.09.2012