`

关于10K面试题的组合排序-Comparator

 
阅读更多
package com.kevin.demo;

import java.util.Comparator;
import java.util.TreeSet;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/**
 * @author  <a href="mailto:foohsinglong@gmail.com">kevin.long</a>
 * @description
 */
public class TestUser {
	
	/**
	 * 班级
	 */
	private Integer classes; 
	
	/**
	 * 类型(teacher or student)
	 */
	private String type;
	
	/**
	 * 姓名
	 */
	private String name;
	
	public TestUser(Integer classes, String type, String name){
		this.classes = classes;
		this.type = type;
		this.name = name;
	}
	
	@Override
	public boolean equals(Object other) {
		if(!(other instanceof TestUser)){
			return false;
		}
		TestUser testUser = (TestUser)other;
		return new EqualsBuilder().append(classes, testUser.getClasses())
										.append(type, testUser.getType())
											.append(name, testUser.getName()).isEquals();
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder().append(classes)
										.append(type)
											.append(name).toHashCode();
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getClasses() {
		return classes;
	}

	public void setClasses(Integer classes) {
		this.classes = classes;
	}
	
	/**
	 * 现有List集合中存放有10W个无序的User(属性:classes 班级;type 身份【学生 or 老师】;name 姓名)对象。
	 * 要求:用JAVA实现将List集合中的User对象按照1-n班并且每个班的老师必须放在该班级学生的前面输出。
	 * (一个班只有一个老师,一个班存在多个老师,这两只情况可以分开用两个算法实现,也可以用一个算法实现,但要考虑性能)例如下面格式:
	 * 1班 老师 张三
	 * 1班 学生 李四
	 * 1班 学生 王五
	 * 2班 老师 张三2
	 * 2班 学生 李四2
	 * 2班 学生 王五2
	 */
	public static void main(String[] args) {
		//按班级排序,然后再按老师和学生循序排序
		TreeSet<TestUser> users = new TreeSet<TestUser>(new Comparator<Object>() {
			public int compare(Object arg0, Object arg1) {
				int calssKey1 = ((TestUser) arg0).getClasses();
				int calssKey2 = ((TestUser) arg1).getClasses();
                if(calssKey1 > calssKey2){ 
                	return 1;
                }else if(calssKey1 < calssKey2){
                	return -1;
                }else{ //在相等的情况下,按照老师排序
                	String typeKey1 = ((TestUser) arg0).getType();
                	String typeKey2 = ((TestUser) arg1).getType();
                	if(TestUserType.STUDENT.equals(typeKey1) && TestUserType.TEACHER.equals(typeKey2)){
                		return 1;
                	}else if(TestUserType.TEACHER.equals(typeKey1) && TestUserType.STUDENT.equals(typeKey2)){
                		return -1;
                	}else{ //在相等的情况下,按照名字排序
                		String nameKey1 = ((TestUser) arg0).getName();
                    	String nameKey2 = ((TestUser) arg1).getName();
                		if(nameKey1.hashCode() > nameKey2.hashCode()){
                			return 1;
                		}else if(nameKey1.hashCode() < nameKey2.hashCode()){
                			return -1;
                		}else{
                			if(arg0.hashCode() > arg1.hashCode()){
                    			return -1;
                    		}else if(arg0.hashCode() < arg1.hashCode()){
                    			return 1;
                    		}else{
                    			return 0;
                    		}
                		}
                	}
                }
			}
		});
		users.add(new TestUser(1, TestUserType.TEACHER, "张三"));
		users.add(new TestUser(2, TestUserType.TEACHER, "张三2"));
		users.add(new TestUser(1, TestUserType.STUDENT, "李四"));
		users.add(new TestUser(2, TestUserType.STUDENT, "李四2"));
		users.add(new TestUser(1, TestUserType.STUDENT, "王五"));
		users.add(new TestUser(2, TestUserType.STUDENT, "王五2"));
		for(TestUser user : users){
			System.out.println(user.getClasses() +"\t"+ user.getType() +"\t"+ user.getName());
		}
	}
}



分享到:
评论

相关推荐

    php-sebastian-comparator3-3.0.2-1.el7.remi.noarch.rpm

    php-sebastian-comparator3-3.0.2-1.el7.remi.noarch.rpm

    Java-中的-Comparator-和-Comparable.md

    Java-中的-Comparator-和-Comparable.md

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

    在Java程序员面试中,了解和掌握相关知识点是至关重要的,因为这是评估候选人技术水平和专业素养的关键环节。以下是一些常见的Java面试题目及其解答: 1. **面向对象的特征有哪些方面?** - 封装:隐藏对象的属性...

    程序实现时间排序Comparator

    标题与描述均提到了“程序实现时间排序Comparator”,这表明文章的主题是关于如何在Java编程环境中使用`Comparator`接口来实现基于时间的排序。在Java中,`Comparator`是一个功能强大的工具,允许开发者自定义对象的...

    Java面试题大全--比较详细

    Java面试题大全涵盖了许多核心Java概念,以下是其中一些关键知识点的详细解释: 1. **面向对象**:Java是一种面向对象的编程语言,它支持类、对象、封装、继承和多态等基本概念。面向对象编程允许我们将数据和操作...

    HBASE-comparator.zip

    标题提到的"HBASE-comparator.zip"文件可能包含了一些关于如何在HBase中实现自定义比较器的示例或教程。HBase的默认行为是按照字节顺序(字典序)对字符串类型的数据进行比较,这可能导致与我们直觉上对于数值大小...

    TLV3501-comparator.zip

    标题"TLV3501-comparator.zip"中提到的"TLV3501"是一款高速比较器,而"comparator"则是比较器的英文名称,暗示了该压缩包可能包含了关于TLV3501高速比较器的相关设计资料。 描述中提到"具有关断模式的 4.5ns 轨到轨...

    iozone-results-comparator:用于分析 IOzone 文件系统基准测试结果的工具

    iozone-results-comparator 是一个 Python 应用程序,用于分析 IOzone 文件系统基准测试的结果。 它以两组或更多组 Iozone 结果作为输入,并使用各种统计方法对它们进行比较。 主要输出是带有表格和图表的 HTML 页面...

    7- Comparator Operation_operation_word_

    标题“7- Comparator Operation_operation_word_”暗示我们将探讨的是与比较器操作相关的内容,特别是与"operation word"(操作字)相关的方面。在本文中,我们将深入理解比较器的工作原理、其在数字系统中的应用...

    idea-api-comparator:用于比较JAR或类之间库版本的API的插件

    `idea-api-comparator` 是一个专为Java开发者设计的插件,它提供了强大的功能,用于比较不同JAR或类库之间的API版本差异。这个工具对于软件开发过程中的版本管理和升级尤其有用,帮助开发者识别不同版本间的API变化...

    C8051F04X-Comparator0

    This software shows the necessary configuration to use Comparator0 as a reset source.

    Java中的Comparator 对多个排序条件的处理

    当需要根据多个排序条件对集合进行排序时,可以使用多个`Comparator`组合的方式来实现。这篇博客文章"Java中的Comparator 对多个排序条件的处理"可能详细讨论了如何实现这一目标。 首先,`Comparator`的基本用法是...

    前端开源库-mozilla-version-comparator

    前端开源库-mozilla-version-comparatorMozilla版本比较器,Mozilla版本比较器是Mozilla软件中使用的版本控制策略的JavaScript实现。请参阅https://developer.mozilla.org/en-us/docs/toolkit_version_格式以获取...

    java排序Comparator和Comparable

    在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...

    mininet-n-ryu-routing-algorithm-comparator:一堆描述拓扑创建,拓扑,测试数据,实时图形渲染,表创建和图表创建的脚本和文件

    Mininet + Ryu路由算法比较器 一堆脚本和文件,描述了拓扑创建,拓扑,测试数据,实时图形渲染,表创建和图表创建。 如何复制这些结果 安装Mininet,Ryu和Python3 在未经Python2编译的Mininet上未经测试 ...

    PID-MPC-comparator-master.zip_MPC与PID_MPC和PID_mpc控制_pid mpc nm

    设计了关于pid和mpc的控制实例,比较pid和mpc的输出特性

    version-comparator:Android版本名称比较器库

    `version-comparator`库解决了这个问题,它允许开发者通过自然排序算法对这些字符串进行准确的比较。 ### 2. Kotlin语言 Kotlin是Google官方推荐的Android开发语言,以其简洁的语法、类型安全性和空安全特性受到...

    Java后端面试题

    ### Java面试题知识点概览 #### 面向对象概念 1. **super()与this()的区别**: - `super()`用于调用父类的构造方法或父类成员方法。 - `this()`用于调用本类中的其他构造方法。 2. **作用域public, protected, ...

    version-comparator:2 个字符串的简单比较器,它们是版本号

    version-comparator-master 压缩包文件可能包含了以下内容: - `version-comparator.js`:主要的 JavaScript 代码文件,实现版本比较的逻辑。 - `README.md`:提供了关于如何使用这个库的文档和示例。 - `test` 目录...

Global site tag (gtag.js) - Google Analytics