自定义了对象,如何按照自定对象中某一或多个元素对其进行排序呢?以下分别从C++和java对其进行实现。
一:C++
/*
实现对自定义的对象类型进行排序(按照其中的元素),首先将对象存放在vector中,然后利用algorithm库函数中的sort对其进行排序,需要重写排序函数以函数名
作为函数指针作为sort的第三个参数
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
struct students{
int age;
string name;
};
void addStudents(vector<students> &vec, int age, string name){
students stu;
stu.age = age;
stu.name = name;
vec.push_back(stu);
}
// 按照年龄进行排序 升序
bool sortByAge(const students &s1, const students &s2){
return s1.age < s2.age;
}
// 先按照年龄进行排序 年纪一样 按照姓名排序
bool sortByAll(const students &s1, const students &s2){
if(s1.age < s2.age) return true;
else if(s1.age > s2.age) return false;
else return s1.name < s2.name;
}
int main(){
vector<students> vec;
addStudents(vec, 20, "zhangming");
addStudents(vec, 20, "xiaoming");
addStudents(vec, 20, "xiaoming2");
addStudents(vec, 23, "xiaohong");
addStudents(vec, 22, "xiaofei");
addStudents(vec, 27, "xiaogang");
cout << "排序前:" << endl;
for(vector<students>::iterator iter = vec.begin(); iter != vec.end(); ++iter){
cout << (*iter).age << " " << (*iter).name << endl;
}
sort(vec.begin(), vec.end(), sortByAll);
cout << "排序后:" << endl;
for(vector<students>::iterator iter = vec.begin(); iter != vec.end(); ++iter){
cout << (*iter).age << " " << (*iter).name << endl;
}
}二:Java
主函数sortClass.java:
package com.test.sort;
import java.util.ArrayList;
import java.util.Arrays;
import com.zack.bean.Students;
public class sortClass {
/*
* ArrayList 中存储了自定义的对象类型, 然后通过toArray()转换为Object类型,再使用java.util.Arrays.sort进行排序
* 注意的是排序要重新实现comparator接口进行,作为sort的第二个参数即myComparator对象
*/
static ArrayList<Students> arrayList = new ArrayList<Students>();
public static void addStudents(int age, String username){
Students s = new Students(age, username);
arrayList.add(s);
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
addStudents(20, "xiaoming");
addStudents(20, "zhangming");
addStudents(20, "xiaoming2");
addStudents(25, "xiaohong");
addStudents(23, "xiaogang");
addStudents(21, "xiaojie");
System.out.println("排序前:");
for(int i = 0; i < arrayList.size(); i++)
{
System.out.println(arrayList.get(i).getAge() + " ::" + arrayList.get(i).getUsername());
}
System.out.println("降排序后:");
Object[] obj = arrayList.toArray();
Arrays.sort(obj, new myComparator());
for(int i = 0; i < obj.length; i++)
{
System.out.println(obj[i]);
}
}
}
myComparator.java:
package com.test.sort;
import java.util.Comparator;
import com.zack.bean.Students;
public class myComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
Students s1 = (Students) o1;
Students s2 = (Students) o2;
if(s1.getAge() < s2.getAge())
return 1;
else if(s1.getAge() > s2.getAge())
return -1;
else return s1.getUsername().compareTo(s2.getUsername());
}
}
Students.java:
package com.zack.bean;
public class Students {
private int age;
private String username;
public Students(int age, String username){
this.age = age;
this.username = username;
}
public int getAge(){
return this.age;
}
public String getUsername(){
return this.username;
}
public String toString(){
return this.age + "::" + this.username;
}
}
原文地址:http://blog.csdn.net/lu597203933/article/details/41776701