Сортировка коллекций Java со спецификацией компаратора - PullRequest
1 голос
/ 24 ноября 2011

Я использую компаратор для сортировки списка пользователей IRC и таких символов, как [ и _ перед @.Как мне предотвратить это?Я хочу, чтобы пользователи, начинающие с этих символов, были среди обычных пользователей.Компаратор, как он выглядит сейчас:

public class UserListSorter implements Comparator<String> { 

// Get the Collator for the current locale.
private Collator collator = Collator.getInstance();     

@Override                                               // The comparator that implements the abovementioned.
public int compare(String o1, String o2) {                                  // Compare these users.
    int compare = compareString(o1.substring(0, 2), o2.substring(0, 2));    // Get the user group of the users (@,+,())
    if (compare == 0) {                                                     // If both are in the same group, sort by
        return compareString(o1, o2);                                       // their name only.
    }
    return compare;                                                         // Else, return a positive value stating
}                                                                           // that @ and + holds a higher value  than ().

private int compareString(String o1, String o2) {                           // Compares the users alphabetically, ignoring small
    return collator.compare(o1, o2);                                        // and capital letters. Used as a basis for sorting algo.
}

}

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Не проверено, но следует сделать трюк:

if  (o1.charAt(0) == '@' && o2.charAt(0) != '@') return 2;
else if  (o1.charAt(0) != '@' && o2.charAt(0) == '@') return -2;
else if  (o1.charAt(0) == '+' && o2.charAt(0) != '+') return 1;
else if  (o1.charAt(0) != '+' && o2.charAt(0) == '+') return -1;
else return o1.compareTo(o2);

Редактировать: текущим поведением является то, что имена начинаются с @> +> any other.

0 голосов
/ 25 ноября 2011

Я бы порекомендовал ввести здесь немного более высокий уровень абстракции и немного больше OO-подхода.

Предположим, мы создаем объект, представляющий нашего пользователя IRC, и назовем его IRCUser:

class IRCUser implements Comparable<IRCUser>
{
     private IRCRole ircRole;
     private String nickName; //full nickname

     public int compareTo(IRCUser otherUser)
     {
        //Implementation
     }
}

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

public enum IRCRole
{
    STANDARD("", 2), PRIVILEDGED("+",1) , OP("@",0)

    IRCRole(String nickNamePrefix, int priority)
    {
        this.nickNamePrefix = nickNamePrefix;
        this.priority = priority;
    }

    private String nickNamePrefix;
    private int priority;

}

Теперь можно сравнить метод CompareTo нашего IRCUser, сравнив роль this пользователя (точнее, роль priority) с ролью пользователя, переданного в качестве аргумента, и после этого выполните простое сравнение строк. , Как насчет этого?

...