Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用泛型实现比较器?_Java_Generics - Fatal编程技术网

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)避免创建和收集两个新字符串。此外,每次创建一个新的比较器没有意义;只需创建一个静态比较器并重用它。