簡體   English   中英

如何在Android或Java中實現比較器以對對象進行排序

[英]How implement comparator in to sort objects in android or java

讓我從以下示例開始:

public void loadList(ArrayList<Calls> list) {
    List<Calls> calls = new ArrayList<Calls>();
    calls.addAll(list);
}

其中Calls是一個簡單的類:

public class Calls {
    public long ms;
    public name;     
} 

我想基於ms字段以升序或降序對上面的List<Calls>進行排序。 我遇到了一些Comparator示例,但仍不清楚。

我想這會有所幫助

public void loadList(ArrayList<Calls> list) {
    List<Calls> calls = new ArrayList<Calls>();
    calls.addAll( list );

    // Ascending Order
    Collections.sort(calls, new Comparator<Calls>() {

        @Override
        public int compare(Calls o1, Calls o2) {
            return (int)(o1.ms-o2.ms);
        }
    });
    // Descending Order
    Collections.sort(calls, new Comparator<Calls>() {

        @Override
        public int compare(Calls o1, Calls o2) {
            return (int)(o2.ms-o1.ms);
        }
    });
}

只需通過以下方式實現比較器:

private class CallsComparator implements Comparator<Calls> {

    @Override
    public int compare(Calls calls1, Calls calls2) {
      //Swap calls1 with 2
      return 1;
      //Spap 2 with 1
      return -1;
      // do nothing
      return 0;
    }

  }

當然,您必須使用if-condition替換我的評論:-)

並使用以下命令執行比較器:

  Collections.sort(calls, new CallsComparator());

請參閱以下示例

class CallsComp implements Comparator<Calls>{

    @Override
    public int compare(Calls c1, Calls c2) {
        if(c1.getMs() < c2.getMs()){
            return 1;
        } else {
            return -1;
        }
    }
}
class MSComaparator implements Comparator<Calls>{

        @Override
        public int compare(Calls lhs, Calls rhs) {
            // TODO Auto-generated method stub
            return lhs.ms-rhs.ms;
        }

    }

    class NameComaparator implements Comparator<Calls>{

        @Override
        public int compare(Calls lhs, Calls rhs) {
            // TODO Auto-generated method stub
            return lhs.name.comapreTo(rhs.name);
        }

    }

並致電:

public void loadList(ArrayList<Calls> list) {
    List<Calls> calls = new ArrayList<Calls>();
    calls.addAll(list);
    Collections.sort(calls,new MSComaparator())
}

如果您只想基於ns進行排序,則可以簡單地實現Comparable:

public class Calls implements Comparable<Calls>{
    public long ms;
    public name;     
    @Override
        public int compareTo(Calls  another) {
            // TODO Auto-generated method stub
            return this.ms>another.ms;
        }
} 

並致電:

public void loadList(ArrayList<Calls> list) {
    List<Calls> calls = new ArrayList<Calls>();
    calls.addAll(list);
    Collections.sort(calls)
}

Calls類需要實現Comparable接口並實現compareTo方法:

public class Calls implements Comparable<Calls> {
   public long ms;
   public name;

   @Override
   public int compareTo(Calls call) {
       // Prepend a -1 for inverse order
       return Long.compare(this.ms,call.ms);
   }
} 

然后,只需調用Collections.sort(calls)對列表進行排序即可。

@ARP

我知道回答這個問題為時已晚,但是我最近在我的項目中實現了同樣的事情,所以我想與你分享

所以在添加列表后在function內部您可以做的是

public void loadList(ArrayList<Calls> list) {
    List<Calls> calls = new ArrayList<Calls>();
    calls.addAll(list);
    Collections.sort(calls, new Comparator<Calls>() {
                @Override
                public int compare(Calls o, Calls t1) {
                    return (int) (o.getMS() - t1.getMS());
                }
            });
}

這將根據ms存在的值為您排序ArrayList<Calls>調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM