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