2011-11-24 49 views
1

我使用的是比較通過IRC用戶列表和人物,如[_@進行排序。我如何防止這種情況?我希望以這些角色開頭的用戶成爲普通用戶。現在看起來比較器:Java集合的排序W /比較細節

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. 
} 

} 

謝謝。

+0

「我該如何預防?」但你期望的行爲是什麼?把用'@'開頭的用戶名放在其他位置之前? – Viruzzo

+0

是的,這是IRC用戶列表的正常行爲。 – dueland

+0

嗯......這與揮杆有什麼關係? – kleopatra

回答

1

未經檢驗的,但應該做的伎倆:

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); 

編輯:當前的行爲是開始@>+>任何其他名字。

+0

我不知道第二行是否不應該'否則,如果(o1.charAt(0)= '@' && o2.charAt(0)== '@'!)返回-1;'? '+'怎麼樣?這似乎是一個部分答案。 –

+0

是的,它必須是'=='(很明顯,第三種情況是等於/不等於)。我不知道你對'+'的意思。如果它是另一個IRC符號,OP沒有提及它,但包含它應該是微不足道的。 – Viruzzo

+0

對不起,我雖然是程序員的常識(沒有冒犯)。此外,所提出的解決方案並不奏效,但它讓我更好地理解比較器的工作原理。 – dueland

0

我會建議在這裏引入一個抽象高一點的水平,並採取多一點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; 

} 

,我們IRCUser的compareTo方法可以用作爲參數傳遞用戶的角色比較this用戶的角色(角色priority要準確)開始的,之後一切都做得那麼實現字符串比較。那個怎麼樣?

+0

是的,它可以工作,但我不會嘗試它,因爲這是一個現在已經到期的交付物。感謝你的建議和你的時間。 爲了記錄,上述解決方案根本不起作用。 @之前的用戶遍佈整個地方,我們剛剛結束了我在第一篇文章中發佈的內容(不完整)。 – dueland