java 如何对对象进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 如何对对象进行排序相关的知识,希望对你有一定的参考价值。

/ 以下是我的源代码。其中还有一个实现了Comparable接口的自定义的Car类未给出, 那不影响我的提问*/
package cn.com.csuinfo.Mycollec;

import java.util.Set;
import java.util.TreeSet;

public class TestMySort

public void BubbleSort(TreeSet<Car> set)

Car c1;
Car c2;
Car c3;
Car c4;
c1=set.pollFirst();//将set中的元素一个个取出来,再存入Car数组中
c2=set.pollFirst();
c3=set.pollFirst();
c4=set.pollFirst();

Car[] iArr=c1,c2,c3,c4; //数组中存放了Car类型的四个对象
Car tmp=null;
int len=set.size();
for(int i=0;i<len-1;i++)//对数组中的对象按属性值price的大小进行排序
for(int j=0;j<len-1-i;j++)
if(iArr[j].price > iArr[j+1].price)
tmp = iArr[j];
iArr[j] = iArr[j + 1];
iArr[j + 1]= tmp;
System.out.println("SB");//测试之注意!:程序没执行到此来???




for(Car car: iArr)
System.out.println(car);




public static void main(String[] args)
TreeSet<Car> set1=new TreeSet<Car>();

Car car1=new Car("Ford",164000);
Car car2=new Car("Honda",286000);
Car car3=new Car("Toyota",410000);
Car car4=new Car("Benz",850000);

set1.add(car1);
set1.add(car2);
set1.add(car3);
set1.add(car4);
System.out.println(”***********************“);

new TestMySort().BubbleSort(set1);



//我知道在TreeSet中添加实现了Comparable接口的元素时,自动为其进行自然排序。但是我在此处就是想通过对对象进行冒泡排序而达到我自定义的排序规则(不考虑用比较器的情况)。 恳请大家帮帮忙咯, 我已经搞了大半天,上面的程序虽然可以运行我想要的结果, 但是还是用的TreeSet中的 自然排序, 程序都没有执行到冒泡排序法中去??万分感谢!

纠正几点错误:
首先TreeSet就是一个二叉树排序容器,由用户定义对象比较规则,然后接口回调进行排序,也就是说当对象在add到容器后实际上已经按照你定义的排序规则排序完毕了,所以你也没有必要再单独写一个排序方法。
如果你想单独写一个排序算法,传送TreeSet()这样已经排序完毕的容器当然是多此一举的。 你可以用List保存你的对象,这样容器保存的就是原始的对象集合(按add()的先后顺序排序),这样才能真正发挥排序方法的功能.

其次,你的冒泡排序算法是按照价格从小到大的,而你add对象的时候就是从小到大的,所以一直没有满足if(iArr[j].price > iArr[j+1].price) 这个条件,可以把>号改成<号,或者打乱add的顺序,这样就能看出效果。

另外从容器内取元素应该用循环,而不应该写死。你应该知道,所以程序我也没修改~

下面的程序在原作上面稍微修改了一下,自己可以比较一下区别
package cn.com.csuinfo.Mycollec;

import java.util.ArrayList;
import java.util.List;

public class TestMySort

public void BubbleSort(List<Car> list)

Car c1;
Car c2;
Car c3;
Car c4;
c1 = list.get(0);// 将set中的元素一个个取出来,再存入Car数组中
c2 = list.get(1);
c3 = list.get(2);
c4 = list.get(3);

Car[] iArr = c1, c2, c3, c4 ; // 数组中存放了Car类型的四个对象
Car tmp = null;
int len = list.size();
for (int i = 0; i < len - 1; i++) // 对数组中的对象按属性值price的大小进行排序
for (int j = 0; j < len - 1 - i; j++)
if (iArr[j].price < iArr[j + 1].price)
tmp = iArr[j];
iArr[j] = iArr[j + 1];
iArr[j + 1] = tmp;
System.out.println("change");// 测试之注意!:程序没执行到此来???



for (Car car : iArr)
System.out.println(car);




public static void main(String[] args)
List<Car> list = new ArrayList<Car>();

Car car1 = new Car("Ford", 164000);
Car car2 = new Car("Honda", 286000);
Car car3 = new Car("Toyota", 410000);
Car car4 = new Car("Benz", 850000);

list.add(car1);
list.add(car2);
list.add(car3);
list.add(car4);
System.out.println("***********************“");

new TestMySort().BubbleSort(list);


参考技术A

这里用到集合的知识了,排序用TreeSet

比如:

     这里我们对一个Person对象进行排序,Person对象里面有两个属性,一个是姓名一个是年龄,我们这里按照年龄升序,如果年龄相同就按照姓名排序;

import java.util.*;
public class Test 
public static void main(String[] args) 
TreeSet<Person> ts = new TreeSet<Person>(new Comparator<Person>()
public int compare(Person p1, Person p2) 
int num = new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
if(num==0)
return p1.getName().compareTo(p2.getName());

return num;

);
ts.add(new Person("zhangsan",20));
ts.add(new Person("zhangsan",30));
ts.add(new Person("lisi",10));
ts.add(new Person("wangwu",40));
for(Person p:ts)
System.out.println(p.getName()+"::"+p.getAge());


参考技术B for(int i=0;i<len-1;i++)
for(int j=0;j<len-1-i;j++)
改成:for(int i=0;i<len-1;i++)
for(int j=i+1;j<len;j++)


试试

以上是关于java 如何对对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何对对象的arraylist进行排序?

Android-java-如何按对象内的某个值对对象列表进行排序

Python入门题045:根据对象属性进行排序

如何根据GPA对数组列表进行升序排序? arraylist 包含一个对象数组。 (Java)[重复]

Java中如何对集合排序

java List对象排序的问题……