【问题标题】:Sorting IRC users by rank and alphabetically - Java Comparator按等级和字母顺序对 IRC 用户进行排序 - Java Comparator
【发布时间】:2012-12-28 04:07:43
【问题描述】:

我正在尝试用 Java 创建一个非常简单的 IRC 客户端,只是为了好玩,并且刚刚开始处理特定于频道的用户列表。我正在使用以下代码对用户列表进行排序,但它并没有按照应有的方式对其进行排序。 IRC 层次结构是这样的:~ & @ % + (qaohv),如果有人没有这些前缀之一,他们应该在用户列表的底部。有人知道我可以做些什么来使用一个比较器保留列表的字母顺序和排名顺序吗?

比较器代码:

public class StringComparator implements Comparator<String> {
    @Override
    public int compare(String a, String b) {
        return a.compareToIgnoreCase(b);
    }       
}

上述比较器的示例输出:

%Brennan
&Adam
&Sheldon
+Mike
+Yoda
@Phil
@Unleashed
Jean
Damien
~Tim

【问题讨论】:

    标签: java list irc comparator


    【解决方案1】:

    在进行字母比较之前,您需要处理前缀的情况:

    public class StringComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            int pfx = betterPrefix(a[0],b[0]);
            if (pfx != 0)
                return pfx;
            return a.compareToIgnoreCase(b);
        }
    
    
        private int betterPrefix(char a, char b) {
            String prefixOrder = "@%&+"
    
            int idxa = prefixOrder.indexOf(a);
            if (idxa < 0) idxa = prefixOrder.length();
            int idxb = prefixOrder.indexOf(b);
            if (idxb < 0) idxb = prefixOrder.length();
    
            return idxa - idxb;
        }       
    }
    

    这里我假设这两个字符串都不为空,但你应该测试一下。

    【讨论】:

    • 这在一定程度上有效,但对没有前缀的人无效。
    • 为什么?没有前缀,indexOf返回-1,差为0。然后,经典比较接管。
    • 哦,好吧,也许我颠倒了测试。尝试使用 idxb - idxa
    • 不,这只是给出了 pastebinned 列表的反面。
    • 哦,我的错!无前缀的索引应该比其他索引更大。我会在几秒钟内更正代码,我希望它会起作用。
    猜你喜欢
    • 2011-08-29
    • 2017-05-22
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多