1. java怎麼對list進行排序
1,使用Comparator 介面
Student類 結構如下:(省略getter,setter方法)
public class Student {
/***
* 姓名
*/
private String name;
private int age;
private String address;
/***
* 考試得分
*/
private int score;
//省略getter,setter方法
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score
+ "]";
}
}
測試方法:
@Test
public void test_ListComparator(){
List<Student>students=new ArrayList<Student>();
Student stu=null;
stu=new Student();
stu.setName("whuang");
stu.setAge(12);
stu.setScore(80);
students.add(stu);
stu=new Student();
stu.setName("rong");
stu.setAge(11);
stu.setScore(90);
students.add(stu);
stu=new Student();
stu.setName("zhu");
stu.setAge(15);
stu.setScore(100);
students.add(stu);
Collections.sort(students,new SystemHWUtil. ListComparator(true,"age"));
System.out.println(students);
}
運行結果:
[Student [name=rong, age=11, score=90], Student [name=whuang, age=12, score=80], Student [name=zhu, age=15, score=100]]
核心類:
public static class ListComparator implements Comparator{
/***
* 是否轉化為Int之後再比較
*/
private boolean isConvertInteger;
/***
* 對哪個列進行排序
*/
private String comparedProperty;
public ListComparator(boolean isConvertInteger,String comparedProperty) {
super();
this.isConvertInteger = isConvertInteger;
this.comparedProperty=comparedProperty;
}
public int compare(Object o1, Object o2) {
if(null!=o1&&null!=o2)
{
try {
Object obj1=ReflectHWUtils.getObjectValue(o1, comparedProperty);
Object obj2=ReflectHWUtils.getObjectValue(o2, comparedProperty);
if(isConvertInteger){
int num1;
int num2;
if(obj1 instanceof Integer){
num1=(Integer)obj1;
num2=(Integer)obj2;
}else{
num1=Integer.parseInt(obj1.toString());
num2=Integer.parseInt(obj2.toString());
}
if(num1>num2){
return 1;
}else if(num1<num2){
return -1;
}else{
return 0;
}
}else{
return obj1.toString().compareTo(obj2.toString());
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return 0/*等於*/;
}
}
2,可以指定是升序還是降序
實例:
@Test
public void test_ListComparator(){
List<Student>students=new ArrayList<Student>();
Student stu=null;
stu=new Student();
stu.setName("whuang");
stu.setAge(12);
stu.setScore(80);
students.add(stu);
stu=new Student();
stu.setName("rong");
stu.setAge(11);
stu.setScore(90);
students.add(stu);
stu=new Student();
stu.setName("zhu");
stu.setAge(15);
stu.setScore(100);
students.add(stu);
SortList<Student> sortList = new SortList<Student>();
sortList.Sort(students, "getAge", "asc");
System.out.println(students);
}
注意:sortList.Sort 的第二個參數是方法名,不是成員變數名.
核心代碼
package com.common.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortList<E> {
public void Sort(List<E> list, final String method, final String sort) {
Collections.sort(list, new Comparator() {
public int compare(Object a, Object b) {
int ret = 0;
try {
Method m1 = ((E) a).getClass().getMethod(method, null);
Method m2 = ((E) b).getClass().getMethod(method, null);
if (sort != null && "desc".equals(sort))// 倒序
ret = m2.invoke(((E) b), null).toString()
.compareTo(m1.invoke(((E) a), null).toString());
else
// 正序
ret = m1.invoke(((E) a), null).toString()
.compareTo(m2.invoke(((E) b), null).toString());
} catch (NoSuchMethodException ne) {
System.out.println(ne);
} catch (IllegalAccessException ie) {
System.out.println(ie);
} catch (InvocationTargetException it) {
System.out.println(it);
}
return ret;
}
});
}
}
2. JAVA如何根據List中對象的屬性進行對象排序(江湖救急!)
最近這么多人問排序的問題啊,都快回答膩了,你可以先搜一搜看看別的網站有沒有,不過既然都回答了,我就估且再發些代碼吧,這里只用String的List排序,如果用到復雜的對象你自己懂得變通吧
publicclassSortList{
privatestaticDateFormatdf=newSimpleDateFormat("yyyy-MM-dd");
publicstaticvoidmain(String[]args){
List<String>dates=newArrayList<String>();
dates.add("2014-10-02");
dates.add("2013-12-01");
dates.add("2014-11-02");
dates.add("2014-01-05");
Collections.sort(dates,newComparator<String>(){
@Override
publicintcompare(Stringo1,Stringo2){
Dated1=null,d2=null;
try{
d1=df.parse(o1);
}catch(ParseExceptione){
e.printStackTrace();
}
try{
d2=df.parse(o2);
}catch(ParseExceptione){
e.printStackTrace();
}
if(null==d1||null==d2){
return0;
}
returnd1.compareTo(d2);
}
});
System.out.println(dates);
}
}
3. java的list集合如何根據對象中的某個欄位排序
下面的代碼是根據學生年齡排序學生list 的一個例子:
importjava.util.ArrayList;
importjava.util.List;
classStudent{
privateStringname;
privateintage;
publicStudent(Stringname,intage){
this.name=name;
this.age=age;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
@Override
publicStringtoString(){
return"Perosn[name="+name+",age="+age+"]";
}
}
publicclassApp{
publicstaticvoidmain(String[]args){
List<Student>students=newArrayList<>();
students.add(newStudent("abc",12));
students.add(newStudent("bcd",20));
students.add(newStudent("cde",17));
students.add(newStudent("def",25));
students.add(newStudent("efg",15));
students.sort((x,y)->Integer.compare(x.getAge(),y.getAge()));
for(Studentstu:students){
System.out.println(stu);
}
}
}
運行結果:
4. java中兩個list集合如何排序
放到一個list中排zd序就專可以了
List<Article>
list
=
new
ArrayList<Article>();
list.addAll(list1);
list.addAll(list2);
然後2層循屬環就可以了
5. java 怎麼將List裡面數據排序
學生實體類,包含姓名和年齡屬性,
比較時先按姓名升序排序,如果姓名相同則按年齡升序排序。
6. java中對list 進行排序
map不可能存在相同的鍵,鍵是唯一的。
7. java List對象排序的問題……
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestTwo {
public static void main(String[] args) {
Navigation n = new Navigation();
List list = n.getNavigations();
Collections.sort(list,new TodoListComparator());
for (int i = 0; i < list.size(); i++) {
Navigation na = (Navigation)list.get(i);
System.out.println(na.getId());
}
}
}
class Navigation {
int id;
String name;
List navigations = new ArrayList();
public Navigation(int id,String name){
this.id = id;
this.name = name;
}
public Navigation(){
Navigation a1 = new Navigation(33,"張三");
Navigation a2 = new Navigation(11,"李四");
Navigation a3 = new Navigation(99,"王五");
Navigation a4 = new Navigation(24,"王五");
navigations.add(a1);
navigations.add(a2);
navigations.add(a3);
navigations.add(a4);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getNavigations() {
return navigations;
}
public void setNavigations(List navigations) {
this.navigations = navigations;
}
}
class TodoListComparator implements Comparator {
public int compare(Object obj1, Object obj2) {
Navigation m1 = (Navigation) obj1;
Navigation m2 = (Navigation) obj2;
int t1 = m1.getId();
int t2 = m2.getId();
if (t1 < t2){
return 1;
}else if (t1 > 2){
return -1;
}else {
return 0;
}
}
}
8. java中list排序
第一種方法,就是list中對象實現Comparable介面,代碼如下:
public class Person implements Comparable<Person> {
private String name;
private Integer order;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the order
*/
public Integer getOrder() {
return order;
}
/**
* @param order
* the order to set
*/
public void setOrder(Integer order) {
this.order = order;
}
@Override
public int compareTo(Person arg0) {
return this.getOrder().compareTo(arg0.getOrder());
}
}
public static void main(String[] args) {
List<Person> listA = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.setName("name1");
p1.setOrder(1);
p2.setName("name2");
p2.setOrder(2);
p3.setName("name3");
p3.setOrder(3);
listA.add(p2);
listA.add(p1);
listA.add(p3);
Collections.sort(listA);
for (Person p : listA) {
System.out.println(p.getName());
}
}
第二種方法,就是在重載Collections.sort方法,代碼如下:
public class Person {
private String name;
private Integer order;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the order
*/
public Integer getOrder() {
return order;
}
/**
* @param order
* the order to set
*/
public void setOrder(Integer order) {
this.order = order;
}
}
public static void main(String[] args) {
List<Person> listA = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.setName("name1");
p1.setOrder(1);
p2.setName("name2");
p2.setOrder(2);
p3.setName("name3");
p3.setOrder(3);
listA.add(p2);
listA.add(p1);
listA.add(p3);
Collections.sort(listA, new Comparator<Person>() {
public int compare(Person arg0, Person arg1) {
return arg0.getOrder().compareTo(arg1.getOrder());
}
});
for (Person p : listA) {
System.out.println(p.getName());
}
}
兩次執行的結果都是:
name1
name2
name3
9. 如何對 List 排序
Collections對List集合中的數據進行排序
有時候需要對集合中的元素按照一定的規則進行排序,這就需要用到
Java中提供的對集合進行操作的工具類Collections,其中的sort方法
先看一個簡單的例子:
public static void main(String[] args) {
List<Integer> nums = new ArrayList<Integer>();
nums.add(3);
nums.add(5);
nums.add(1);
nums.add(0);
System.out.println(nums);
Collections.sort(nums);
System.out.println(nums);
}
輸出結果:
[3, 5, 1, 0]
[0, 1, 3, 5]
稍微復雜的List裡面放一個復雜的對象
package core.java.collection.collections;
public class User implements Comparable<User>{
private int score;
private int age;
public User(int score, int age){
super();
this.score = score;
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(User o) {
int i = this.getAge() - o.getAge();//先按照年齡排序
if(i == 0){
return this.score - o.getScore();//如果年齡相等了再用分數進行排序
}
return i;
}
}
public static void main(String[] args) {
List<User> users = new ArrayList<User>();
users.add(new User(78, 26));
users.add(new User(67, 23));
users.add(new User(34, 56));
users.add(new User(55, 23));
Collections.sort(users);
for(User user : users){
System.out.println(user.getScore() + "," + user.getAge());
}
}
輸出結果:
55,23
67,23
78,26
34,56
我們會發現sort(List<T>)方法中List中的T必須實現Comparable<T>介面,然後實現
compareTo()方法,該方法的返回值0代表相等,1表示大於,-1表示小於;為什麼
在簡單例子中沒有看到實現Comparable介面呢?是因為Integer類其實自己已經實現
了Comparable介面,Java已經給我們做好了。
Collections提供的第二種排序方法sort(List<T> list, Comparator<? super T> c)
先看例子:
package core.java.collection.collections;
public class Students {
private int age;
private int score;
public Students(int age, int score){
super();
this.age = age;
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
public static void main(String[] args) {
List<Students> students = new ArrayList<Students>();
students.add(new Students(23, 100));
students.add(new Students(27, 98));
students.add(new Students(29, 99));
students.add(new Students(29, 98));
students.add(new Students(22, 89));
Collections.sort(students, new Comparator<Students>() {
@Override
public int compare(Students o1, Students o2) {
int i = o1.getScore() - o2.getScore();
if(i == 0){
return o1.getAge() - o2.getAge();
}
return i;
}
});
for(Students stu : students){
System.out.println("score:" + stu.getScore() + ":age" + stu.getAge());
}
}
輸出結果:
score:89:age22
score:98:age27
score:98:age29
score:99:age29
score:100:age23
從上面的例子我們可以看出Students類沒有實現Comparable<T>介面,只是在sort()方法
中多傳入一個參數,只不過該參數是一個介面我們需要實現其compare方法。
以上就是是Java中Colelctions工具類為我們提供的兩種集合排序方法。