“如何根据员工对象的id或名称对集合进行排序”。为此,我们可以使用两个接口,即comparator和carparable。
这似乎是常见的面试问题之一
但是我看不出为什么我应该同时使用这两个来对employee对象进行排序
我一直在思考comparator
实现了carparate
无法实现的功能。我明白,如果对象(所比较的实例变量)具有自然顺序,那么carable
是正确的选择。但是,如果需要自定义排序(例如字符串长度),那么可以编写比较器。
这里我的观点是,comparator
只有当客户机希望按照其他条件对数据进行排序时才需要。例如,我将实现一个Employee类
,使用carable interface
按ID
排序。但是,如果客户机希望按字符串
(name)对Employee对象进行排序,他将实现comparator
作为具体类或匿名排序。我这里有什么遗漏吗?
(The commented-out parts of the code works. They are just different implementations)
mport java.util.Collections;
import java.util.Comparator;
import java.util.*;
public class PersonComparator implements Comparable{
private String name;
private int age;
public PersonComparator(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name=" + name + ", age=" + age;
}
/*@Override
public int compareTo(Object obj) {
if (!(obj instanceof PersonComparator)) {
throw new ClassCastException("Invalid object");
}
PersonComparator p2 = (PersonComparator)obj;
return this.age-p2.age;
}*/
/*Alternative CompareTo that checks for both age and name*/
public int compareTo(Object obj) {
if (!(obj instanceof PersonComparator)) {
throw new ClassCastException("Invalid object");
}
PersonComparator p2 = (PersonComparator)obj;
if (this.age!=p2.age){
return this.age-p2.age;
}
else {
return (this.name.length()-p2.name.length());
}
}
/*public static Comparator nameLengthComparator
= new Comparator() {
@Override
public int compare(Object obj1, Object obj2) {
if (!(obj1 instanceof PersonComparator) || !(obj2 instanceof PersonComparator)){
throw new ClassCastException("Invalid object");
}
else {
PersonComparator p1 = (PersonComparator)obj1;
PersonComparator p2 = (PersonComparator)obj2;
return p1.name.length()-p2.name.length();
}
}
};*/
public static void main(String[] args){
PersonComparator p1 = new PersonComparator("Alexander", 45);
PersonComparator p2 = new PersonComparator("Pat", 27);
PersonComparator p3 = new PersonComparator("Zacky", 45);
PersonComparator p4 = new PersonComparator("Rake", 34);
List<PersonComparator> list = new ArrayList<PersonComparator>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
System.out.println("Before sorting "+ list);
Collections.sort(list);
//System.out.println("After sorting by age "+ list);
//System.out.println("Before sorting "+ list);
//Collections.sort(list, nameLengthComparator);
System.out.println("After sorting by name length "+ list);
/*Collections.sort(list, new Comparator<PersonComparator>() {
@Override
public int compare(PersonComparator p1, PersonComparator p2) {
return p1.name.length()-p2.name.length();
}
}
);*/
System.out.println("After sorting by name length "+ list);
}
}
carable
接口定义类型的自然顺序。假设您有一个string
或integer
对象列表;您可以将该列表传递给
Collections.sort(list);
你会有一个排序的列表。怎么做?因为string
和integer
都实现了carable
接口,而carable
接口的实现提供了自然的顺序。这就像类定义所说的那样--“如果您发现了一个属于我的类型的对象集合,请按照我在compareto
方法中定义的策略对它们进行排序”。
现在,当您定义自己的类型时,您可以通过实现carable
接口来定义类对象的自然顺序。有关对象排序的更多信息,请参见Java文档。
comparator
接口描述如何定义对象排序的自定义策略。假设我们有一个简单的person
类型,如下所示:
public class Person {
String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
现在,通过实现comparator
接口,您可以编写不同的策略来排序person
类型的实例。例如,考虑下面给出的对Person
对象进行排序的两种策略:
class StrategyOne implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().length() - p2.getName().length();
}
}
class StrategyTwo implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}
在这里,StrategyOne
将根据名称的长度对Person
对象进行排序,StrategyTwo
将根据名称的词典顺序对Person
对象进行排序。
class Strategies {
private static final Comparator<Person> PERSON_NAME_LENGTH_COMPARATOR = new StrategyOne();
private static final Comparator<Person> PERSON_NAME_LEXICAL_COMPARATOR = new StrategyTwo();
public static Comparator<Person> personNameLengthComparator(){
return PERSON_NAME_LENGTH_COMPARATOR;
}
public static Comparator<Person> personNameLexicalComparator(){
return PERSON_NAME_LEXICAL_COMPARATOR;
}
}
本文向大家介绍HTML5相比于HTML4有哪些优势?相关面试题,主要包含被问及HTML5相比于HTML4有哪些优势?时的应答技巧和注意事项,需要的朋友参考一下 1.更强的语义化 2.更丰富的功能,比如 3.更简洁的模板语法
如果我有一个PriorityQueue,它有一个Comparator,一个element类实现了Comparable类,以及它们的排序冲突,那么队列将如何处理排序?它是抛出异常还是忽略一个排序规则?
谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜
问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通
我的任务是用java编写mergesort,任务还规定我不能使用整数,我必须使用可比较的整数。这是我第一次使用java。我的问题是在合并函数内比较两个comp int数组中的元素。我尝试了if(list[I])compareTo(list2[j]),但compareTo只能取整数。任何帮助都将不胜感激
Spring3.2引入了注释,用于处理SpringMVC应用程序中的异常。但在此版本之前,Spring有或Spring MVC应用程序中的异常处理。那么为什么Spring3.2引入注释来处理异常呢?我坚信,Spring 3.2引入了注释,以解决或 >的局限性,或使异常处理更加强大。 有人能解释一下相对于或处理异常的优势吗?