`
kankan1218
  • 浏览: 276673 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

对象排序之Comparator,Comparable接口区别(华为面试题):

阅读更多
给了个类,要求编写一段代码,给以下类型的数据排序(按index降序排):
public class A{
  public int index ; 
  public String str;
  public …… ;
}
条件:
1.数据量很大,要求性能够;
2.扩展性好:按其他数据类型(如 String str,……)排序的时候,不需要修改组件,以后还可能增加其他类型的数据。
(提示:可以调用现成的java.util包中的排序.)

对象排序之Comparator,Comparable接口区别:

1.comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合 collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式(策略模式Strategy),将算法和数据分离,就像C++ STL中的函数对象一样。
2.前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
3.一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。
4.而Comparator的作用有两个:
 a,如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator来实现比较算法进行排序
 b,可以更加灵活实现排序规则,为了使用不同的排序标准做准备,比如:升序、降序,或者将来想通过类的其他字段进行排序


Name类,实现comparable接口来对对象进行排序:
public class Name implements Comparable<Name>{
 public String firstName, lastName, id;
  
 public Name(String firstName,String lastName,String id){
          this.firstName=firstName;
          this.lastName=lastName;
          this.id=id;
      }
     public int compareTo(Name o) {          //重写
          int lastCmp=lastName.compareTo(o.lastName);
          return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
      }   
     public String toString(){                //便于输出测试
          return firstName+" "+lastName;
      }
}


NameSort类,测试
import java.util.*;
public class NameSort {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
   Name[] nameArray = new Name[]{
                new Name("John", "Lennon","3556465464644343"),
                new Name("Karl", "Marx","3556465461111111"),
                new Name("Groucho", "Marx","3805236412578"),
                new Name("Oscar", "Grouch","8854321622238")
            };
            Arrays.sort(nameArray);
            for(int i=0;i<nameArray.length;i++){
                System.out.println(nameArray[i].toString());
            }
 }
}


更加灵活的是方式是实现Comparator接口,使用Collections.sort(List<T> list, Comparator<? super T> c)这个方法进行排序:
FIRST_NAME_ORDER类
import java.util.*;
public class FIRST_NAME_ORDER implements Comparator<Name>{
 public int compare(Name n1, Name n2) {
        int firstCmp=n1.firstName.compareTo(n2.firstName);
        return (firstCmp!=0?firstCmp:n1.lastName.compareTo
                (n2.firstName));
 }
}


在上面的NameSort中将 Arrays.sort(nameArray);替换成下面语句
List<Name> list=Arrays.asList(nameArray); //将名字数组转化为List
Collections.sort(list,new FIRST_NAME_ORDER());


总结:
1.这里自定义FIRST_NAME_ORDER,通过Collections.sort(List,Comparator)实现排序,当需求有变需要按照其他规则(比如id)排序时,只有重新定义一个Comaprator----ID_ORDER_Comparator,而不用修改Name或原来的排序器FIRST_NAME_ORDER,然后修改客户端代码,只有就基本满足了程序设计的一个重要原则---开闭原则,即可以通过增加新类方便的扩充新功能,满足新需求而不用修改原来的代码。
2.如果我们采用让Name实现Comaparable接口,则在想采用新的排序规则时,必须修改Name里的 comareTo(Object o)方法,这样就违反了开闭原则,所以应该用Comparator,而不是Comparable.

分享到:
评论

相关推荐

    java华为面试题

    【Java 华为面试题详解】 在 Java 面试中,华为公司常常会考察候选人的基础理论知识、编程实践以及并发处理等能力。以下是对这些面试题的详细解析: 1. **面向对象的特征** - 封装:隐藏对象的属性和实现细节,仅...

    Java面试题集锦6:华为面试题 管理资料.pdf

    【Java面试知识点详解】 在Java面试中,面试官通常会关注候选人的基础知识、编程能力、设计...对于华为这样的大型科技公司,面试通常会更加深入,不仅测试技术基础,还会考察问题解决能力、团队协作精神以及项目经验。

    华为面试题集锦

    【华为面试题集锦】是针对求职者准备华为公司面试所整理的一份文档,涵盖了Java相关的面试题目。这些题目旨在测试求职者的编程基础、面向对象理解、异常处理、集合框架运用以及多线程和Web开发的基本知识。 1. **...

    华为java面试题

    ### 华为Java面试题知识点解析 #### 一、Java面向对象基础 1. **super()与this()的区别** - `super()`用于调用父类的构造方法或父类中的成员方法。 - `this()`用于调用本类中的其他构造方法。 2. **作用域public...

    JAVA华为面试题.pdf

    在Java编程语言中,面试题涵盖了广泛的知识点,包括面向对象的特性、数据类型、类库、集合框架、多线程以及Web开发中的JSP和Servlet。以下是对这些知识点的详细解释: 1. **面向对象的特征**:面向对象编程(OOP)...

    java程序员面试题3---java华为面试题.

    - 接口:Runnable、Comparator、Iterable 7. **ArrayList、Vector、LinkedList的存储性能和特性:** - ArrayList和Vector基于动态数组,支持随机访问但插入和删除较慢,Vector是线程安全的。 - LinkedList基于...

    华为JAVA笔试面试题

    接口:Runnable、Comparator、Serializable、Iterable、Servlet 【ArrayList、Vector、LinkedList的存储性能和特性】 ArrayList和Vector都是基于动态数组实现,适合随机访问但插入和删除元素相对较慢,Vector线程...

    java华为面试题目

    Java是世界上最流行的编程...这些知识点涵盖了Java基础、面向对象、异常处理、集合框架、多线程以及Web开发中的JSP部分,对于理解和应对华为的Java面试至关重要。深入理解和掌握这些概念,能够帮助你在面试中表现出色。

    大公司面试题

    ### 大公司面试题:JAVA华为面试题解析 #### 面向对象的特征有哪些方面? 面向对象编程(Object-Oriented Programming, OOP)的主要特征包括: 1. **封装**:封装是将数据(属性)和操作这些数据的方法(行为)...

    huawei面试题--java篇

    ### 华为Java面试知识点详解 #### 一、面向对象的特征 面向对象编程的核心特征主要包括以下几个方面: ...以上就是从给定的华为Java面试题中提炼出来的关键知识点及其详细解释。希望对你有所帮助!

    华为java笔试题,java常见笔试题

    - 常用接口:Runnable、Comparator、Iterable、List、Map 【ArrayList、Vector、LinkedList的存储性能与特性】 ArrayList和Vector都是基于数组实现,支持按索引访问,但插入和删除元素时需要移动大量元素,效率较...

    华为OD机试C卷- 字符串排序(Java & JS & Python).md-私信看全套OD代码及解析

    ### 华为OD机试C卷- 字符串排序(Java & JS & Python) #### 题目背景 本题目来源于华为OD机试C卷,主要考察应聘者对字符串操作和排序算法的理解与应用能力。题目要求根据特定的排序规则对一系列单词进行排序,并...

    华为OD机试C卷- 字符统计及重排(Java & JS & Python).md-私信看全套OD代码及解析

    ### 华为OD机试C卷- 字符统计及重排(Java & JS & Python) #### 题目概述 本题目要求实现一个程序来处理一个由字母组成的字符串(不包含空格)。任务是统计该字符串中每一个字母(区分大小写)出现的次数,并根据...

    华为OD机试C卷- 高效的任务规划(Java & JS & Python & C).md-私信看全套OD代码及解析

    ### 华为OD机试C卷 - 高效的任务规划 #### 颇具挑战性的IT编程题目 本文档提供了一道关于高效任务规划的问题,适用于多种编程语言(包括Java、JavaScript、Python 和 C),主要考察了算法设计与实现的能力。 ####...

    华为OD机试C卷- 导师请吃火锅(Java & JS & Python).md-私信看全套OD代码及解析

    ### 华为OD机试C卷 - 导师请吃火锅题目分析与解答 #### 题目背景 本题目来源于华为OD机试C卷,主要考察应聘者在软件开发领域解决问题的能力,尤其是针对实际场景问题的应用能力。题目通过一个生动的场景——“导师...

    Verilog 典型电路设计(华为内部资料)

    这份“Verilog 典型电路设计(华为内部资料)”是华为公司内部使用的教程,旨在帮助工程师掌握Verilog的设计技巧和实践应用。 1. **基础概念与语法** - **模块定义**:在Verilog中,电路设计的基本单位是模块,它...

    华为OD机试C卷- 路口最短时间问题(Java & JS & Python & C).md-私信看全套OD代码及解析

    ### 华为OD机试C卷 - 路口最短时间问题 #### 题目背景 在解决实际生活中交通导航系统中的路径规划问题时,我们常常会遇到需要综合考虑多个因素的情况,例如道路的距离、红绿灯的等待时间等。本题目模拟了一个简化...

    jdk1.8.0-win-64.zip

    Lambda表达式使得处理集合和事件变得更加容易,特别是与Functional Interface(如Runnable、Comparator等)结合使用时。 其次,Java 8添加了方法引用和构造器引用,这进一步增强了Lambda表达式的功能。方法引用允许...

    jdk1.8.0_151.zip

    例如,Runnable、Comparator和Function是常见的函数式接口。Java 8还引入了一个新的包`java.util.function`,其中包含了大量的函数式接口,以支持更广泛的函数编程场景。 Stream API是Java 8的另一个重要增强,它...

Global site tag (gtag.js) - Google Analytics