Re: [問題] Collections.sort更簡潔的寫法?

作者: haha02 (來人!上夾棍!)   2015-05-29 00:40:21
※ 引述《james732 (好人超)》之銘言:
: 使用IDE:Android Studio 1.2.1.1
: 我有一個class:
: class MyData
: {
: public int i, j, k, l, m, n, o; // 七組資料
: };
: 然後有個 List 裝了很多個 Data
: List<MyData> dataList = new ArrayList<MyData>();
: 我希望讓使用者可以選擇根據i,j,k,l,m,n,o的某一項來排序list,所以寫了
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
想到一個方法給你參考看看
先弄一個列舉,看要放在MyData裡面還是另外寫在外部都可以:
public enum Index{
I, J, K, L, ...,O;
}
然後寫一個comparator 可以寫成你主要class的內部類別
class MyComparator implements Comparator<MyData>{
private Index idx = Index.I;
public int compare(MyData lhs, MyData rhs) {
int[] larray = {lhs.i, lhs.j, lhs.k, ...lhs.o};
int[] rarray = {rhs.i, rhs.j, rhs.k, ...rhs.o};
int index = idx.ordinal();
return (larray[index] > rarray[index]);
}
public void setIdx(Index idx){
this.idx = idx;
}
}
這樣只要new一次 之後在每次傳給Collections.sort之前調整Index就好了
例如要以k排序:
comparator.setIdx(Index.K);
Collections.sort(dataList, comparator);
因為只有調整comparator 而sort那行的寫法不管要怎麼排序都是一樣的
所以可以把sort的程式碼寫在別的地方 假設寫在updateUI()方法裡面
改變排序方式的時候只需要在事件監聽內寫
comparator.setIdx([由user決定]);
updateUI();
就可以了
這邊用列舉寫是避免手殘傳錯 用int搭配訂常數即可 只是用int要稍微注意錯誤處理
另外用列舉的話你可以把它當作下拉選單被選取後傳回的物件 直接塞給setIdx
應該有更好的寫法啦... 剛好想到這個 參考看看吧

Links booklink

Contact Us: admin [ a t ] ucptt.com