2012-11-23 193 views
5

名單上有一個List<String>List<Integer>。兩者都是按照特定的順序(它們是鏈接的)。 List<String>包含名稱和List<Integer>它們的值。排序按價值

有沒有辦法按大小對List<Integer>進行排序,還可以更改List<String>的排序,以便值和名稱保持關聯?

回答

14

您應該使用的List<NameAndValue>而不是兩個列表(並找到一個更好的名字比NameAndValue,這反映了這些數據實際上代表)。 Java是OO語言。使用對象。這就是他們的目標:包含相關的數據,並提供方法和封裝的行爲。

一旦你有了這個類,您就可以按名稱進行排序,值或兩者兼而有之,並添加如果需要的話將不會是一個問題的附加字段列表。

+0

哦天哪,我thoght我是第一個用這種方法... – ppeterka

+0

downvoter:關心解釋你的投票嗎? –

+0

哇,最不恰當的downvote有史以來? – ppeterka

15

你需要java.util.TreeMap<Integer,String>。此根據其鍵的自然順序進行排序,或者由一Comparator在地圖創建時提供,這取決於被用於其上constructor

+1

+1是不明智的屬於一起在不同的地方存儲數據......無論是定義一個類這一點,或至少放入地圖<整數,字符串>此 – ppeterka

+2

是否有人可以提供例如 – pedja

+2

[這裏]( http://bit.ly/WFel56)是一個很好的。 – jlordo

2

-您可以使用java.util.TreeMap<Integer, String>其中實施SortedMap。它排序在關鍵的自然排序。您可以使用java.util.Comparator<T>來排序。

1

乾淨的代碼角度來看,如果這些屬於一起,這種結構可以重用別的地方,你應該創建一個類從他們的,並使其實現可比:

public SomeClass implements Comparable<SomeClass> { 

    private Integer id; 
    private String name; 

    private Whatever elseIsNeededHere; 

    /* getters'n'setters*/ 

    // ******** THOU SHALT NEVER FORGET THY FRIENDS, EQUALS AND HASHCODE, OR ELSE THEY TURN TO BE THY FOES ******** 
    @Override 
    public boolean equals(Object other) { //do what it takes } 

    @Override 
    public int hashCode() { //do what it takes! } 

    /* actually implement Comparable */ 
    @Override 
    public int compareTo(SomeClass o) { 
     //null check, and other bloat left out for sake of brevity 
     return this.id.compareTo(o.getId()); 
    } 

}

然後你就可以有一個列表包含屬於什麼在一起,真的很好排序它

ArrayList<SomeClass> myList = getMyData(); 
Collections.sort(myList); 

myList列表實例按您想要的方式排序。

如果你想不同的比較 - 方法,你可以用其他的方式,通過使用Comparators

Collections.sort(myList,new Comparator<SomeClass>() { 
    public int compare(SomeClass a, SomeClass b) { // do what it takes } 
    }); 
0

你可以試試這個:

創建一個自定義比較器類,如:

import java.util.Comparator; 

/** 
* Created by Maddy Sharma on 7/17/2015. 
* Contains sorting logic to sort Dialogs by its date(long) 
*/ 
public class DateDialogComparator implements Comparator<UserChatDialog>{ 

// lhs.getLastMessageDateSent() is the long value 

    @Override 
    public int compare(UserChatDialog lhs, UserChatDialog rhs) { 
    // This line will work in java 7 and Android API Level 19 
    // return Long.compare(lhs.getLastMessageDateSent(), rhs.getLastMessageDateSent()); 


           'OR' 


     if(lhs.getLastMessageDateSent()>rhs.getLastMessageDateSent()) 
      return -1; 
     else if(lhs.getLastMessageDateSent()<rhs.getLastMessageDateSent()) 
      return +1; 
     return 0; 
    } 
} 

把它從活動或片段,如:

ArrayList<UserChatDialog> myList = userChatDialogList; 
Collections.sort(myList, new DateDialogComparator()); 
Log.i("List after sorting is:", "" + userChatDialogList);