Java 如何使用泛型实现比较器?
只是Java 如何使用泛型实现比较器?,java,generics,Java,Generics,只是Arraylist的一个小问题。我想按名称对ArrayList进行排序 Class Client{ String name; int phonenumber ..} 这段代码完成了这项工作,但我收到了一条编译器警告:“使用未检查或不安全的操作”。有什么问题吗 public void sortByName(){ Collections.sort(ListofClients, new NameComparator()); } 我的比较器如下所示: public class Nam
Arraylist
的一个小问题。我想按名称对ArrayList
进行排序
Class Client{ String name; int phonenumber ..}
这段代码完成了这项工作,但我收到了一条编译器警告:“使用未检查或不安全的操作”。有什么问题吗
public void sortByName(){
Collections.sort(ListofClients, new NameComparator());
}
我的比较器如下所示:
public class NameComparator implements Comparator{
public int compare(Object client1, Object client) {
String name1 = ((Client) client1).getName();
String name2 = ((Client) client2).getName();
return name1.toUpperCase()).compareTo(name2.toUpperCase();
}
}
如果我使用“
implements Comparator
”,我会得到一个错误:“NameComparator不是抽象的,并且不会覆盖java.util.Comparator中的抽象方法compare(Client,Client)。我的Comparator错了吗?很抱歉,这是一个noob问题,是java的新手,我假定您的客户端列表就是这种类型
List<Client>
列表
在这种情况下,比较器的类型应为
comparator
,并在实施比较器后执行适当的比较(在本例中按名称)您需要更改:
public int compare(Object client1, Object client)
{
...
}
对此
public int compare(Client client1, Client client)
{
// Now you don't have to cast your objects!
}
这都是因为比较器的定义
public interface Comparator<T>
{
public compare(T o1, T o2);
}
公共接口比较器
{
公众比较(tO1,tO2);
}
请注意泛型参数T如何显示在方法名称中
像Eclipse/Netbeans/IntelliJ这样的IDE在这种情况下会有所帮助。直接返回结果:)@bruno请注意,您的比较器不处理空名称。如果有效的客户端对象不能有空名称,为什么要这样做呢?旁注:使用compareToIgnoreCase()而不是大写值-因为它可以(a) 享受提前终止的好处,并且(b)避免创建和收集两个新字符串。此外,每次创建一个新的比较器没有意义;只需创建一个静态比较器并重用它。