java給list排序
㈠ java 怎麼將List裡面數據排序
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Comparator;
importjava.util.List;
publicclassArrayListOrder{
publicstaticvoidmain(String[]args){
List<List<Integer>>list=newArrayList<List<Integer>>();
List<Integer>arrayList1=newArrayList<Integer>();
arrayList1.add(2);
arrayList1.add(5);
arrayList1.add(6);
list.add(arrayList1);
List<Integer>arrayList2=newArrayList<Integer>();
arrayList2.add(2);
arrayList2.add(4);
arrayList2.add(6);
list.add(arrayList2);
List<Integer>arrayList3=newArrayList<Integer>();
arrayList3.add(2);
arrayList3.add(6);
arrayList3.add(6);
list.add(arrayList3);
List<Integer>arrayList4=newArrayList<Integer>();
arrayList4.add(2);
arrayList4.add(1);
arrayList4.add(6);
list.add(arrayList4);
for(List<Integer>tmpList:list){
System.out.print(tmpList.get(1)+"");
}
System.out.println("");
//排序
Collections.sort(list,newComparator<List<Integer>>(){
publicintcompare(List<Integer>list1,List<Integer>list2){
//比較每個ArrayList的第二個元素
if(list1.get(1)==list2.get(1)){
return0;
}elseif(list1.get(1)>list2.get(1)){
return1;
}else{
return-1;
}
}
});
for(List<Integer>tmpList:list){
System.out.print(tmpList.get(1)+"");
}
}
}
㈡ 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);
}
}
}
運行結果:
㈢ 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;
}
});
}
}
㈣ JAVA中list排序問題
compareTo
只是比較2個字元串,不能進行排序
String
s1
=
"abc";
String
s2
=
"abcd";
String
s3
=
"abcdfg";
String
s4
=
"1bcdfg";
String
s5
=
"cdfg";
String
s6="abc";
System.out.println(
s1.compareTo(s2)
);
//
-1
(前面相等,s1長度小1)
System.out.println(
s1.compareTo(s3)
);
//
-3
(前面相等,s1長度小3)
System.out.println(
s1.compareTo(s4)
);
//
48
("a"的ASCII碼是97,"1"的的ASCII碼是49,所以返回48)
System.out.println(
s1.compareTo(s5)
);
//-2
System.out.println(
s1.compareTo(s6)
);
//
0
比較方法其實就是對字元串中的字元逐個比較ASCII
值相減,如果2個字元串是包含關系返回長度差。Collections.sort方法才是對LIST
進行排序的方法。
㈤ Java的List怎麼排序啊
用Collections.sort就可以排序,
裡面的排序是默認的按自然順序排列
也就是1,2,3,4這種
參數要求實現了Comparable的數據才能排序,
如果你自己寫的類,你就要實現Comparable介面,然後在介面裡面自動生成的方法裡面
指定排序方法,一般的String Inteneger類都是實現了這個介面的 不用自己操作的。
你可以取看源代碼
㈥ java中list排序
最好是在將日期插入list前排序,即在sql查詢是排序,這樣比較好處理。
另一種方法是構建一個比較類或比較方法,如一樓所述。
㈦ Java的List怎麼排序啊
問題在於
doubletemp=0.0;
你把temp設置成double型,然後
temp=arr.get(l).doubleValue();
所以你把取得的int類型轉換成了double類型,最後輸出就帶上了.0
你仔細看看你的程序,int類型有的排序後沒有變,有的變x.0了,凡是加上.0的都是它在排序過程中與double類型的數字進行過交換。
㈧ java 怎麼將List裡面數據排序
不好意思,上午只是粗略地看了一下,沒有細致看,現在詳細回答你的提問。
ArrayList底層是用一個長度為10的Object數組實現,不管添加進去什麼類型的數據,都會轉換成Object對象,除非你用很早以前的JDK版本。這樣就好理解了,像你寫的程序arrayList1中add了String和Integer兩種類型的數據,這兩類對象沒有什麼可比性,就像拿打火機和U盤比一個性質。所以,是沒有辦法進行直接排序的。
你要求的是要按ArrayList裡面的第1、2、4數據進行排序,這個可以。
先來arrayList1
四個數據分別是2、"daas"、6、"1",第1、2、4數據即2、「daas」、「1」,我選擇按照String類型進行排序,所以第1個數據2轉換成String類型即可。因為第3個數據6不進行排序,remove就好。這是個題還是個什麼,其實還是留了點活路的,因為後面的(你arrayList234下面)代碼都是往arrayList1中添加的,而且還都是String類型。這也是我選擇String類型進行排序的原因。代碼如下:
List arrayList1 = new ArrayList();
arrayList1.add(2); //0
arrayList1.add("daas"); //1
arrayList1.add(6); //2
arrayList1.add("1"); //3
list.add(arrayList1);
//my code
String convert = String.valueOf(arrayList1.get(0));
arrayList1.remove(2);
arrayList1.remove(0);
arrayList1.add(convert);
/此處為你的arrayList234代碼
Collections.sort(arrayList1);
for(int i = 0; i < arrayList1.size(); i++) {
System.out.println(arrayList1.get(i));
}
結果為:
1
2
3
5
8
daas
因為怕你深挖,強調兩點:
第一點,由結果看出Collections.sort(arrayList1),是以String的ASCII碼進行排序的,為了證明這一點,就要看原代碼,這時你就會發現JDK中String的compareTo方法是個空實現,底層並不是用java寫的,這點沒事,我們可以用一定的方法讓它把特徵暴露出來,然後就可以理解思想。你看我下面寫的小測試程序就會明白。
String a = new String("Z");
String b = new String("A");
System.out.println(a.compareTo(b));
String c = new String("A");
String d = new String("B");
System.out.println(c.compareTo(d));
//看結果,證明String的自然順序比較即比較ASCII值,只是第一步。
//看結果,證明compareTo返回值是後面的ASCII碼減支前面的ASCII碼,第二步。
String e = new String("g");
String f = new String("e");
String h = new String("h");
List<String> list = new ArrayList<String>();
list.add(e);
list.add(f);
list.add(h);
Collections.sort(list);
for(String i : list) {
System.out.println(i);
}
結果為:
25
-1
e
g
h
//證明String的自然排序即ASCII碼從小到大排序,最後一步。
第二點,你的要求是「要按ArrayList裡面的第1、2.4數據進行排序,分別怎麼做啊」,這個問題的描述有問題,或者不詳細,arryList2、arrayList3、arrayList4任何一個裡面一共就add了3個數據,哪來第4個。如果是分別對arrayList234裡面的數據進行排序,兩個選擇,(1)把所有Integer轉換成String類型,再排序,參考arrayList2。(2)運用Integer.valueOf()方法,將內容為數字的String數據轉換成Integer,把原來的remove掉,把內容非數字的String數據remove掉,再排序,桶排序、冒泡排序、快速排序等你隨便選。
講解到這,不管想對哪個list進行排序,你應該都會寫了。
總結:
除非比較ASCII碼,Integer類型和內容為非數字的String類型數據是沒有辦法進行比較的,不管是直接比較,還是間接比較。還是上面那句話,像打火機和U盤沒有可比性一樣,理解這點很重要。
即使用Integer.valueOf()方法對內容為非數字的String類型數據進行轉換沒有用,會報NumberFormatException。說這點意思是如果你想按Integer類型排序,得把所有內容為非數字的String類型數據remove掉。
題外話:這種類型的題我記得上大學的時候有,不知道你是不是學生,今天想來,其實用處真不大,都用泛型,現在寫代碼不用泛型的程序員幾乎是完全不存在了。
祝心情愉快~~
親手打,如果滿意,把分給我吧~~哈哈。。
㈨ JAVA中list集合的排序
根據字元串的含義,進行對象化,比如,Student,有三個屬性,序號,姓名,分數
注意重寫Student的Compareable介面
然後,List<String>變成List<Student> students=new ArrayList<Student>
然後,遍歷list,算出平均分,放入新的SortList<Student>
列印結果