Comparator按照姓名、年龄排序

package com.heli.compare;

import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

/**
 * @desc Person类。 Person实现了Comparable接口,这意味着Person本身支持排序
 */
public class Person implements Comparable<Person> {
	int age;
	String name;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public String toString() {
		return name + " - " + age;
	}

	/**
	 * 比较两个Person是否相等:若它们的name和age都相等,则认为它们相等
	 */
	boolean equals(Person person) {
		if (this.age == person.age && this.name == person.name)
			return true;
		return false;
	}

	/**
	 * @desc 实现 “Comparable<String>” 的接口,即重写compareTo<T t>函数。
	 *       这里是通过“person的名字”进行比较的
	 */
	@Override
	public int compareTo(Person person) {
		return name.compareTo(person.name);
		// return this.name - person.name;
	}
}

/**
 * @desc AscAgeComparator比较器 它是“Person的age的升序比较器”
 */
class AscNameComparator implements Comparator<Person> {
	@Override
	public int compare(Person p1, Person p2) {
		String one = p1.getName();
		String two = p2.getName();
		Collator ca = Collator.getInstance(Locale.CHINA);
		int flags = 0;
		if (ca.compare(one, two) < 0) {
			flags = -1;
		} else if (ca.compare(one, two) > 0) {
			flags = 1;
		} else {
			flags = 0;
		}
		return flags;
	}
}

/**
 * @desc AscAgeComparator比较器 它是“Person的age的升序比较器”
 */
class AscAgeComparator implements Comparator<Person> {
	@Override
	public int compare(Person p1, Person p2) {
		return p1.getAge() - p2.getAge();
	}
}

/**
 * @desc DescAgeComparator比较器 它是“Person的age的升序比较器”
 */
class DescAgeComparator implements Comparator<Person> {
	@Override
	public int compare(Person p1, Person p2) {
		return p2.getAge() - p1.getAge();
	}
}
package com.heli.compare;

import java.util.ArrayList;
import java.util.Collections;

public class Test {

	public static void main(String[] args) {
		// 新建ArrayList(动态数组)
		ArrayList<Person> list = new ArrayList<Person>();
		// 添加对象到ArrayList中
		list.add(new Person("郭德纲", 20));
		list.add(new Person("安华", 30));
		list.add(new Person("赵紫阳", 10));
		list.add(new Person("单田芳", 40));
		// 打印list的原始序列
		System.out.printf("Original  sort, list:%s\n", list);
		// 对list按照中文姓氏排序,暂未实现多音字,如单田芳 应该shantianfang
		Collections.sort(list, new AscNameComparator());
		System.out.printf("Asc(family name)  sort, list:%s\n", list);
		// 通过“比较器(AscAgeComparator)”,对list进行排序
		// AscAgeComparator的排序方式是:根据“age”的升序排序
		Collections.sort(list, new AscAgeComparator());
		System.out.printf("Asc(age)  sort, list:%s\n", list);
		// 通过“比较器(DescAgeComparator)”,对list进行排序
		// DescAgeComparator的排序方式是:根据“age”的降序排序
		Collections.sort(list, new DescAgeComparator());
		System.out.printf("Desc(age) sort, list:%s\n", list);
	}
}
时间: 2024-11-06 09:55:26

Comparator按照姓名、年龄排序的相关文章

[示例-NSArray排序]-根据班级、姓名和年龄排序学生信息

main: 1 #import <Foundation/Foundation.h> 2 #import "Person.h" 3 4 int main(int argc, const char * argv[]) { 5 @autoreleasepool { 6 Person *stu1=[[Person alloc]initClasses:@"iOS8" andName:@"ZXY" andAge:21]; 7 Person *st

集合内部先实现按年龄排序再实现以姓名排序

定义一个实体存放需要排序的数据 package ListAscByCollectionsMethod; /* * 定义一个实体,存放数据. */ public class User { String name; String age; public User(String name,String age){ this.name=name; this.age=age; } public String getAge() { return age; } public void setAge(Strin

Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循

第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double salary; public Worker (){} public Worker (String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } public

员工年龄排序

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25144793   对公司所有员工的年龄进行排序,公司总共有几万名员工,要求时间复杂度为O(n). 很明显的计数排序题目,员工的年龄肯定在一个范围之内,我们这里假设在0-99之内,算很大了,这样就可以开辟一个长度为100的数组,保存各个年龄的员工的个数. 代码如下: /* 员工年龄排序,主要用计数排序的思想, 时间复杂度为O(n),需要固定大小的额外辅助空间 */ #include<std

年龄排序(计数排序)

/* 员工年龄排序,主要用计数排序的思想,时间复杂度为o(n),需要固定大小的额外辅助空间 */ #include<stdio.h> #include<string.h> /* 计数排序,员工年龄可定在0-99之间 void *memset(void *s, int ch, size_t n) 函数解释:将s中当前位置后面的n个字 节 (typedef unsigned int size_t )用 ch 替换并返回 s .memset:作用是一 段内存块中填充某个给定的值,它是对

【剑指offer】员工年龄排序

典型的以空间换时间问题,思路非常重要! /* 员工年龄排序 员工可能有几万名,要求时间复杂度为O(n) 思路:员工的年龄必定在一个范围内,比方0-99,那么我们建立一个大小为100的辅助数组,然后遍历 员工年龄,取到一个年龄就将该年龄相应数组位置的值加1,终于数组中便保存了不同年龄的员工的个数 最后,打印数组就可以. by Rowandjj 2014/7/22 */ #include<iostream> using namespace std; #define MAX 100 void sor

员工年龄排序之桶排序

我也不知道今天这题目纠结半天我在纠结个啥,题目要求对一个公司所有员工的年龄排序,只能申请O(n)大小的辅助空间.然后看到题目里面的解法大致思路是利用辅助空间记录各个年龄的出现次数,然后接下来的代码硬是读了半天. 1 int index=0; 2 for(int i=0;i<=oldestAge;i++){ 3 for(int j=0;j<timesOfAge[i];j++){ 4 age[index]=i; 5 index++; 6 } 7 } 之前看到题目后的意思是对公司的员工年龄排序,比如

14周(二维数组姓名成绩排序)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:14周(二维数组姓名成绩排序) *作者:王忠 *完成日期:2014.12.01 *版本号:v1.0 * *问题描述:初始化同学的成绩,姓氏,按大小排序 *输入描述:无 *程序输出:按照姓名或者成绩大小排序并输出 #include <iostream> #include <string> using namespace std; const int num=8; i

字典添加一类,删除,按姓名排序,按年龄排序

#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n",[[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); #import <Foundation/Foundation.h> #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autorele