【问题标题】:How implement comparator in to sort objects in android or java如何实现比较器以在 android 或 java 中对对象进行排序
【发布时间】:2014-01-06 12:30:15
【问题描述】:

让我从下面的例子开始:

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&lt;Calls&gt; 进行升序或降序排序。我遇到了一些Comparator 的例子,但仍然不清楚。

【问题讨论】:

  • 您尝试了哪些示例?还有什么不清楚
  • Comparator 接口中有一个方法叫做 compare(Object O1, Object O2)。你必须覆盖(实现)它。把你的排序逻辑放在那里......逻辑很简单......如果 O1.ms
  • @TheLostMind +1 完美运行..

标签: java android sorting


【解决方案1】:

我想这会有所帮助

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);
        }
    });
}

【讨论】:

  • 别忘了调用 youradapter.notifyDataSetChanged();以便立即进行更改。
【解决方案2】:

看下面的例子

class CallsComp implements Comparator<Calls>{

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

【讨论】:

    【解决方案3】:

    以这种方式实现一个比较器:

    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 条件替换我的 cmets :-)

    并执行比较器:

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

    【讨论】:

      【解决方案4】:

      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) 对您的列表进行排序。

      【讨论】:

        【解决方案5】:
        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)
        }
        

        【讨论】:

          【解决方案6】:

          @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&lt;Calls&gt; 呼叫 .

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-24
            • 1970-01-01
            相关资源
            最近更新 更多