Сортировка ArrayList‹Object› по сопоставимому интерфейсу

На самом деле я хочу отсортировать массив объектов. Я использую интерфейс Comparable для этой цели. Это полностью работает. Но проблема в том, что когда я сортирую, возникают две проблемы.

  1. Все имена, у которых 1-я буква заглавная, собираются вместе вверху, а все имена, у которых 1-я буква прописная, собираются вместе внизу.

  2. Все отсортированные слова с заглавными буквами собираются вместе, после чего все слова со строчными буквами собираются внизу вместе.

Вот моя фасоль

MyShares.java

   public class Myshares implements Comparable<Myshares> {

        int id, parent;
        String name, path, type, shared_with, shared_or_not, upload_request;

        public int getParent() {
            return parent;
        }

        public void setParent(int parent) {
            this.parent = parent;
        }

        public String getUpload_request() {
            return upload_request;
        }

        public void setUpload_request(String upload_request) {
            this.upload_request = upload_request;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPath() {
            return path;
        }

        public void setPath(String path) {
            this.path = path;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getShared_with() {
            return shared_with;
        }

        public void setShared_with(String shared_with) {
            this.shared_with = shared_with;
        }

        public String getShared_or_not() {
            return shared_or_not;
        }

        public void setShared_or_not(String shared_or_not) {
            this.shared_or_not = shared_or_not;
        }

        @Override
        public int compareTo(Myshares another) {

            return this.name.compareTo(another.getName());
        }

    }

это результат

введите здесь описание изображения

Я думаю, что это основано на коде ASCII. Мне нужен полный отсортированный список. Взгляни, пожалуйста.


person Nikhil Agrawal    schedule 24.04.2013    source источник
comment
Если вы думаете, что это основано на коде ASCII, почему бы вам просто не сравнить .toUpper()?   -  person Javier Diaz    schedule 24.04.2013


Ответы (5)


Если вам нужна сортировка без учета регистра, я бы рекомендовал изменить ваш метод compareTo(), чтобы вместо этого использовать метод compareToIgnoreCase() String, а именно:

public int compareTo(Myshares another) {
    return this.name.compareToIgnoreCase(another.getName());
}
person nullPainter    schedule 24.04.2013
comment
@jlordo: вероятно, из-за опечатки (compareToIgnoringCase() вместо compareToIgnoreCase()). Это непростая публика! - person nullPainter; 24.04.2013
comment
Я исправил, как только увидел ;) - person jlordo; 24.04.2013
comment
@nullPainter Спасибо, сэр, ваше решение сработало для меня. +1 за ваш ответ. - person Nikhil Agrawal; 24.04.2013

Сдача

@Override
public int compareTo(Myshares another) {
    return this.name.compareTo(another.getName());
}

to

@Override
public int compareTo(Myshares another) {
    return String.CASE_INSENSITIVE_ORDER.compare(this.name, another.getName());
}

или используйте более читаемое, а также очень хорошее решение, опубликованное nullPainter.

person jlordo    schedule 24.04.2013

вы должны изменить свой метод compareTo()

return this.name.toLowerCase().compareTo(another.getName().toLowerCase());
person Marco Forberg    schedule 24.04.2013
comment
я должен признать, что compareToIgnoreCase, предложенный nullPainter, было бы лучшим решением, поскольку мой не является нулевым безопасным - person Marco Forberg; 24.04.2013

Замените метод compareTo на:

public int compareTo(Myshares another) {
  return this.name.compareToIgnoreCase(another.getName());
}
person Arjun Rao    schedule 24.04.2013

Я дал вам некоторый источник существующего компаратора, который я написал, который выполняет полную алфавитно-цифровую сортировку и будет работать с числами в именах, таких как 10, 1 и т. д.

Чтобы использовать его, вы можете сделать: Collections.sort(myList, comparator);

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

Ознакомьтесь с GIST с исходным кодом по адресу: https://gist.github.com/gondor/9328de5fa0cce130bc3b

person Jeremy Unruh    schedule 24.04.2013
comment
Вам не кажется, что это очень длинно. - person Nikhil Agrawal; 24.04.2013
comment
Что ж, в зависимости от ваших потребностей, если вы нажмете строки с 1name, 2name, 10name или любыми другими символами, вы обнаружите, что они будут отсортированы как 1name, 10name и т. д. Этот компаратор учитывает все это и идеально сортирует. Будет даже правильно сортировать IP-адреса или имена хостов. - person Jeremy Unruh; 24.04.2013
comment
Ответы только для ссылок на этом сайте не так хороши. Если ссылка устареет, ответ бесполезен. Вы всегда должны копировать соответствующие части ответа, и вы все равно можете ссылаться на источник. - person jlordo; 24.04.2013
comment
Компараторов, которые разумно работают с числовыми компонентами, к сожалению, не хватает во многих приложениях, так что +1 по крайней мере за это! - person nullPainter; 26.04.2013