Java学习笔记--- Java对List集合的排序
2016-10-23 12:52
519 查看
转载博客地址:
http://blog.csdn.net/liaodehong/article/details/50573804
由于其功能性和灵活性,ArrayList是
Java 集合框架中使用最为普遍的集合类之一。ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进行动态的扩展和缩减。
使用Collections工具类进行排序:
使用Collections排序非常简单,我们只需要把实现了Comparable接口的类传入里面调用一下Collections.sort()
方法就可以对其进行排序了。
一般使用这个方法最多的就是对string和Integer进行排序,因为他们内部都很好的实现了Comparable化这个接口。
[java] view
plain copy
print?
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
compareTo这个方法放到后面再细说。现在我们来检验一下Collections.sort对字符串的排序。
Collections.sort(list,
new PriceComparator());的第二个参数返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。
[html] view
plain copy
print?
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("c");
list.add("b");
list.add("8d");
Collections.sort(list);
System.out.println(list);
}
内部的排序方法是按照字母的顺序一个一个来比较的,比如上面这段代码,打印的结果是[8d, b, c],这里按说8d要比c大,但是8d却排在最前面,因为他只对比首位,只有首位相同的时候,才会按照位数依次往下比较;比如下面这段代码:
[java] view
plain copy
print?
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a1");
list.add("a2aaaaaaaa");
list.add("a3aaaa");
Collections.sort(list);
System.out.println(list);
}
结果为:[a1, a2aaaaaaaa, a3aaaa]
Comparable 是带有单一 compareTo()方法的接口。一个实现了
Comparable 接口的类对象可以与其它同类型的对象进行比较,实现 Comparable 接口的类需要重写 compareTo()方法,这个方法接收一个同类型的对象,并实现这个对象和传递给方法的另一个对象比较的逻辑。compareTo()方法返回Int类型的比较结果,分别代表下面的含义:
正值表示当前对象比传递给 comPareTO()的对象大
负值表示当前对象比传递给 comPareTO()的对象小
零表示两个对象相等
举一个例子,假如我们现在有一个Student类,类里面有两个变量,一个名称,一个年龄,假如我们需要按年龄进行排序的话,就需要重写comPareTO()这个方法;
[java] view
plain copy
print?
public class Student implements Comparable{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public Student() {
super();
}
@Override
public int compareTo(Object o) {
return (this.getAge() < ((Student) o).getAge() ? -1 :
(this.getAge() == ((Student) o).getAge() ? 0 : 1));
}
上面我们实现了基于年龄的比较,有很多人喜欢将(this.getAge() –((Student) o).getAge())作为返回的比较结果。尽管使用这种 return 语句看上去似乎很吸引人,并且也不会对我们的例子造成影响,我的建议是远离这种语句。想象一下,比较整数值,其中有一个或者两个都是负数的结果。这会导致一些错误,让你的程序行为不定,而且更重要的是,这样的错误是很细微的,尤其是在大型的企业应用中很难检测出来。
Comparator 接口与Comparable 接口相似也提供了一个单一的比较方法叫作 compare()。然而,与 Comparable的 compareTo()方法不同的是,这个
compare()接受两个同类型的不同对象进行比较。
[java] view
plain copy
print?
public class Student{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public static Comparator ageComparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ( ((Student) o1).getAge() < ((Student) o2).getAge() ? -1 :
(((Student) o1).getAge() ==((Student) o2).getAge() ? 0 : 1));
}
};
public Student() {
super();
}
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setAge(17);
Student st=new Student();
st.setName("李四");
st.setAge(-1);
List<Student> list=new ArrayList<Student>();
list.add(s);
list.add(st);
Collections.sort(list,ageComparator);
System.out.println(list);
}
}
总结:有很多人倾向于不要使用接口,因为这样会提高类的耦合度,选择方法一直是我们所纠结的地方,其实一个 使用Comparable 对象可以说“我可以自己与另外一个对象比较”而一个使用 Comparator
对象可以说“我可以比较两个不同的对象”。你不能说一个接口比另一个要好。选择的接口取决于你需要实现的功能。
http://blog.csdn.net/liaodehong/article/details/50573804
由于其功能性和灵活性,ArrayList是
Java 集合框架中使用最为普遍的集合类之一。ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进行动态的扩展和缩减。
使用Collections工具类进行排序:
使用Collections排序非常简单,我们只需要把实现了Comparable接口的类传入里面调用一下Collections.sort()
方法就可以对其进行排序了。
一般使用这个方法最多的就是对string和Integer进行排序,因为他们内部都很好的实现了Comparable化这个接口。
[java] view
plain copy
print?
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
compareTo这个方法放到后面再细说。现在我们来检验一下Collections.sort对字符串的排序。
Collections.sort(list,
new PriceComparator());的第二个参数返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。
[html] view
plain copy
print?
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("c");
list.add("b");
list.add("8d");
Collections.sort(list);
System.out.println(list);
}
内部的排序方法是按照字母的顺序一个一个来比较的,比如上面这段代码,打印的结果是[8d, b, c],这里按说8d要比c大,但是8d却排在最前面,因为他只对比首位,只有首位相同的时候,才会按照位数依次往下比较;比如下面这段代码:
[java] view
plain copy
print?
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a1");
list.add("a2aaaaaaaa");
list.add("a3aaaa");
Collections.sort(list);
System.out.println(list);
}
结果为:[a1, a2aaaaaaaa, a3aaaa]
使用Comparable排序ArrayList
Comparable 是带有单一 compareTo()方法的接口。一个实现了Comparable 接口的类对象可以与其它同类型的对象进行比较,实现 Comparable 接口的类需要重写 compareTo()方法,这个方法接收一个同类型的对象,并实现这个对象和传递给方法的另一个对象比较的逻辑。compareTo()方法返回Int类型的比较结果,分别代表下面的含义:
正值表示当前对象比传递给 comPareTO()的对象大
负值表示当前对象比传递给 comPareTO()的对象小
零表示两个对象相等
举一个例子,假如我们现在有一个Student类,类里面有两个变量,一个名称,一个年龄,假如我们需要按年龄进行排序的话,就需要重写comPareTO()这个方法;
[java] view
plain copy
print?
public class Student implements Comparable{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public Student() {
super();
}
@Override
public int compareTo(Object o) {
return (this.getAge() < ((Student) o).getAge() ? -1 :
(this.getAge() == ((Student) o).getAge() ? 0 : 1));
}
上面我们实现了基于年龄的比较,有很多人喜欢将(this.getAge() –((Student) o).getAge())作为返回的比较结果。尽管使用这种 return 语句看上去似乎很吸引人,并且也不会对我们的例子造成影响,我的建议是远离这种语句。想象一下,比较整数值,其中有一个或者两个都是负数的结果。这会导致一些错误,让你的程序行为不定,而且更重要的是,这样的错误是很细微的,尤其是在大型的企业应用中很难检测出来。
使用 Comparator 排序 ArrayList
Comparator 接口与Comparable 接口相似也提供了一个单一的比较方法叫作 compare()。然而,与 Comparable的 compareTo()方法不同的是,这个compare()接受两个同类型的不同对象进行比较。
[java] view
plain copy
print?
public class Student{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public static Comparator ageComparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ( ((Student) o1).getAge() < ((Student) o2).getAge() ? -1 :
(((Student) o1).getAge() ==((Student) o2).getAge() ? 0 : 1));
}
};
public Student() {
super();
}
public static void main(String[] args) {
Student s=new Student();
s.setName("张三");
s.setAge(17);
Student st=new Student();
st.setName("李四");
st.setAge(-1);
List<Student> list=new ArrayList<Student>();
list.add(s);
list.add(st);
Collections.sort(list,ageComparator);
System.out.println(list);
}
}
总结:有很多人倾向于不要使用接口,因为这样会提高类的耦合度,选择方法一直是我们所纠结的地方,其实一个 使用Comparable 对象可以说“我可以自己与另外一个对象比较”而一个使用 Comparator
对象可以说“我可以比较两个不同的对象”。你不能说一个接口比另一个要好。选择的接口取决于你需要实现的功能。
相关文章推荐
- Java学习笔记(37)----------List集合
- java 集合学习笔记2-ArrayList LinkedList Vector 泛型 增强for 可变参数
- Java学习笔记之集合(四):LinkedList集合的特点和常用方法
- java学习笔记—自定义实现linkedList集合
- Java集合源码学习笔记(三)LinkedList分析
- Java学习笔记30(集合框架四:List接口)
- 学习笔记_毕向东 Java_集合框架_LinkedList 2014.7.22
- Java学习笔记List集合
- Java集合学习笔记(通过比较器对集合元素排序)
- Java学习笔记之集合(二):List集合的常用方法
- 黑马程序员----Java集合框架学习笔记1-List 与Set
- java 集合学习笔记1-Collection 集合遍历 List子类特点
- 安卓学习笔记---对List集合进行排序(正序或者倒叙)
- Java集合源码学习笔记(五)ArrayList,LinkedList,Vector和Hashtable,HashMap的比较
- list 集合排序,java8新特性,学习一下
- Java学习笔记---List集合检查重复
- 集合框架ArrayList、List、Vector+JAVA学习笔记-DAY15
- 黑马程序员--Java基础学习笔记【集合-List、泛型】
- 13. Java类集 Part 1(类集、Collection接口、List接口、Set接口、SortedSet接口、集合的输出) ----- 学习笔记
- JAVA学习笔记(二十)- 集合 List