在Java中,是否可能覆盖String类的compareTo方法?

4
我有一个生成随机IP地址的类。我需要对这个列表进行排序,但是我需要使用自己的逻辑来比较这两个字符串。
我希望做法是覆盖String类中的compareTo方法并使用Arrays.sort()方法,但我不知道这是否可行。
我以前曾经覆盖过compareTo方法,但我总是只比较同一类中的实例变量。
/* Sorts array in ascending order
 *
 * @param    ips     An array of IP Addresses
 * @return           A sorted array of IP Addresses
 */
 public String[] sort(String[] ips)
 {
     String[] arr = ips;

     Arrays.sort(arr);

     return arr;
 }

我知道还有其他方法可以完成这个任务,但是我认为这种方法会更加优雅。如果你有不同意见,请随时告诉我。我不仅想学习如何编写代码,还想学会如何高效地编写代码。


注意,覆盖compareTo以更改行为几乎从不是有意义的。特别是考虑到a.compareTo(b)b.compareTo(a)之间的区别,其中ab具有不同的行为。 - Tom Hawtin - tackline
5个回答

21

8
我知道这并不是你想要的回答方式,但我觉得你需要一个IP地址类而不是一个字符串类。否则,你的解决方案将是“stringly”类型化的。请参考IP地址类。

1
那绝对是比我的答案更好的方法。 - assylias

4

无法完成。String是final的,不能被覆盖。

你的类应该实现自己的compareTo并执行逻辑。

你可以将所有内容封装在自定义类中或实现自定义比较器。

听起来你正在犯一个类似于不够考虑对象的错误。String原始类型并不是像这样自定义逻辑的最佳封装。最好将所有内容都放在自己设计的一个对象中。


1
我明白了。我一定会记住的,但是对于这个任务,我们需要使用字符串... - jacky

2
你可以尝试在Arrays类中使用以下方法: public static void sort(T[] a, Comparator c);
例如:
Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                            // provide your comparison logic here
                return 0;
            }
        });

0
你需要实现Comparable接口并实现compareTO(Object)方法。
class IP implements Comparable<IP>{
    String ip;
    IP(String ip){
         this.ip=ip
       }

    String getIP(String ip){
    return ip;

    }

public int compareTo(IP){
return ip.compareTo(ip.getIP());
}

}

现在您可以调用 Collection.sort(object_ip) 并传递 IP 类的对象。

对象的类型是String。不过我已经让它正常工作了,谢谢! - jacky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接