您的位置:首页 > 编程语言 > Java开发

JAVA数组、集合排序

2014-07-10 00:52 260 查看
程序排序的几种方式

一、JAVA排序的三种实现方式:
1、数组排序 -》
Arrays.sort(class)
Arrays.sort(class, fromIndex, toIndex) //对指定位置排序
对数组中数据进行排序,这种排序方式是对于数组而言的,数组中的对象需要实现class Person implements Comparable<Person>这个接口,泛型的参数就是比较的时候的参数,详细看如下案例:
class Person implements Comparable<Person> {
private int age;
private String name;

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

public int getAge() {return age;}

public String getName() {return name;}

@Override
public int compareTo(Person o) {return (this.getName().charAt(0) + "").compareTo(o.getName().charAt(0)+ "");}
}
这里类实现了Comparable<Person> 这个接口,传入了对象本身这个参数,实现了比较的方法中参数,这里比较的时候,比较灵活的是this去与对应的方法体参数比较 ******
public static void main(String[] args) {
Person[] persons = new Person[5];
persons[0] = new Person(15, "Tom");
persons[1] = new Person(10, "Hanmeimei");
persons[2] = new Person(17, "Lilei");
persons[3] = new Person(9, "Cookie");
persons[4] = new Person(25, "Jerry");

Arrays.sort(persons);//这里已经完成了对数组中的对象排序,这里排序的规则就是我们实现了Comparable这个接口,自己定义的规则

for (int i = 0; i < persons.length; i++) {
System.out.println(persons[i].getName());
}
}
2、第二种方式implements Comparator,这种方式与第一种不同的,第一种自己类本身就必须实现Comparable这个接口,但是出现一种情况,类本身没有实现这个接口,而我们又不同修改这个类,怎么办?包装类,就类的基础上包装这个,从而达到第一种效果,不过,还有更简单的第二种方式,直接实现Comparator这个接口,这是发现二者的第一个不同(猜测,没依据),废话不多说,看代码:
I:没有做任何处理的类:
class Dog {
private int age;
private String name;

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

public int getAge() {return age;}

public String getName() {return name;}
}
II:创建新的类实现接口,同时实现接口中的方法,完成比较
class ComparatorDog implements Comparator<Dog> {
@Override
public int compare(Dog o1, Dog o2) {
return (o1.getName().charAt(0) + "").compareTo(o2.getName().charAt(0)+ "");
}
}
III:方法中调用
public static void main(String[] args) {
Dog[] dogs = new Dog[3];
dogs[0] = new Dog(1, "Tom");
dogs[1] = new Dog(5, "Jerry");
dogs[2] = new Dog(3, "Cookie");

Arrays.sort(dogs, new ComparatorDog());//特别注意这里调用的方式,方法里第一个参数是自身的类的数组,第二个参数是实现了Comparator这个接口的类

for (int i = 0; i < dogs.length; i++) {System.out.println(dogs[i].getName());	}
}
总结:以上二种方法都能完成对类的的排序,比较,相对而言,第二种更加灵活,在不改变类的基础上,完成了对数组中元素进行排序,灵活在于,它可以实现多哥比较器,比如对年龄排序的比较器,又比如对身高、名字、体重的比较器,这样一个类有了多种比较的方式。

3、完成继承的排序,暂时这么说,看案例:
父类(超类)
class Anim{
private int age;
private String name;
public Anim(int age, String name) {this.age = age;this.name = name;}
public int getAge() {return age;}
public String getName() {return name;}
}
class Cat extends Anim{
public Cat(int age, String name) {super(age, name);}
}
class Pig extends Anim{
public Pig(int age, String name) {super(age, name);}
}
二个子类实现了父类,那么对于这种有共同属性的,我们可以直接实现父类的比较器,而子类则不需要实现,这样,父类的比较器能用于所有的子类
class ComparatorAnim implements Comparator<Anim>{
@Override
public int compare(Anim o1, Anim o2) {return -o1.getAge() + o2.getAge();}
}

public static void main(String[] args) {
Pig[] pigs = new Pig[3];
pigs[0] = new Pig(5, "Tom");
pigs[1] = new Pig(1,"Jerry");
pigs[2] = new Pig(7,"Cookie");

Arrays.sort(pigs,new ComparatorAnim());

for (int i = 0; i < pigs.length; i++) {System.out.println(pigs[i].getAge());}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2、集合排序
///以下内容摘抄网络,找不到原地址///

Java API针对集合类型排序提供了两种支持:
java.util.Collections.sort(java.util.List)
java.util.Collections.sort(java.util.List, java.util.Comparator)
第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。
第二个方法要求实现一个java.util.Comparator接口。

第一个方法案例:
实现接口
class Tree implements Comparable<Tree> {
private int age;
private String name;

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

public int getAge() {return age;	}

public String getName() {return name;}

@Override
public int compareTo(Tree o) {return this.getAge() - o.getAge();	}
}
完成集合的操作
public static void main(String[] args) {
List<Tree> trees = new ArrayList<Tree>();
trees.add(new Tree(4, "Tom"));
trees.add(new Tree(1, "Aom"));
trees.add(new Tree(6, "Bom"));
trees.add(new Tree(2, "Rom"));
trees.add(new Tree(7, "Pom"));

Collections.sort(trees);//这里直接调用上面的的方法就能完成排序
Collections.reverse(trees);// 反转

for (Tree tree : trees) {System.out.println(tree.getAge());}
}
第二个方法的案例:
这里不做案例贴码,原理跟上面数组的排序的原理一样

父类的原理,同数组原理一样

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3、集合转变成为数组,数组转变成为集合
1、数组---->集合
这里比较好实现,通过利用帮助类Arrays.asList(class)就能完成数组到集合的转变
案例:
class Wolf{
private int age;
private String name;
public Wolf(int age, String name) {this.age = age;this.name = name;}
public int getAge() {return age;}
public String getName() {return name;}
}
public static void main(String[] args) {
Wolf[] wolfs = new Wolf[3];
wolfs[0] = new Wolf(1, "Tom");
wolfs[1] = new Wolf(1, "Jerry");
wolfs[2] = new Wolf(1, "Cookie");

List<Wolf> lists = Arrays.asList(wolfs);//这里是数组转变成集合
for (Wolf wolf : lists) {
System.out.println(wolf.getName());
}
}
这来完成了从数组到集合转变

2、集合---->数组
Wolf[] ws = (Wolf[]) lists.toArray();//集合转变成数组
for (int i = 0; i < ws.length; i++) {
System.out.println(ws[i].getName());
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: