【问题标题】:Sorting objects using Collections.sort(). Getting an error使用 Collections.sort() 对对象进行排序。收到错误
【发布时间】:2013-10-04 12:26:09
【问题描述】:

我正在尝试使用 Collections.sort() 对 java 中的对象列表进行排序。但我不断收到此错误:类型参数不在其范围内”。有谁知道我该如何解决这个问题?

我的代码

   public List<String> fetchNumbersForLeastContacted()
   {


    List<String> phonenumberList = getUniquePhonenumbers();
    List<TopTen> SortList = new ArrayList<TopTen>();


    Date now = new Date();
    Long milliSeconds = now.getTime();

    //Find phone numbers for least contacted
    for (String phonenumber : phonenumberList)
    {



       int outgoingSMS = fetchSMSLogsForPersonToDate(phonenumber, milliSeconds).getOutgoing();
       int outgoingCall = fetchCallLogsForPersonToDate(phonenumber, milliSeconds).getOutgoing();

       //Calculating the total communication for each phone number
       int totalCommunication = outgoingCall + outgoingSMS;

       android.util.Log.i("Datamodel", Integer.toString(totalCommunication));

       SortList.add(new TopTen(phonenumber, totalCommunication, 0));

    }

    //This is where I get the error
   Collections.sort(SortList);

TopTen.class

public class TopTen {

private String phonenumber;
private int outgoing;
private int incoming;


public TopTen (String phonenumber, int outgoing, int incoming)
{
    this.phonenumber = phonenumber;
    this.incoming = incoming;
    this.outgoing = outgoing;


}

public String getPhonenumber() {
    return phonenumber;
}

public void setPhonenumber(String phonenumber) {
    this.phonenumber = phonenumber;
}

public int getOutgoing() {
    return outgoing;
}

public void setOutgoing(int outgoing) {
    this.outgoing = outgoing;
}

public int getIncoming() {
    return incoming;
}

public void setIncoming(int incoming) {
    this.incoming = incoming;
}}

【问题讨论】:

    标签: android list sorting collections


    【解决方案1】:
    public static void sort (List<T> list)
    

    此方法只能在T 实现Comparable 接口时使用。 implements Comparable 的意思是存在一个标准,通过该标准可以比较和排序两个 T 类型的对象。在您的情况下,TTopTen,它没有实现Comparable

    你需要做什么:

    public class TopTen  implements Comparator<TopTen> {
    
        ....
        ....
    
        @Override
        public int compareTo(TopTen other) {
    
            if (this == other) return EQUAL;
    
            return this.getPhonenumber().compareToIgnoreCase(other.getPhonenumber());
    
        }
    

    这将基于phonenumber 字段比较两个TopTen 对象。如果您希望根据其他条件对对象进行排序,请使用该条件返回 -1(之前)、0(等于)或 1(之后)。

    例如,要基于incoming 进行排序,请使用以下命令:

    @Override
    public int compareTo(TopTen other) {
    
        final int BEFORE = -1;
        final int EQUAL = 0;
        final int AFTER = 1;
    
        if (this == other) return 0;
    
        if (this.getIncoming() > other.getIncoming()) {
            return AFTER;
        } else if (this.getIncoming() < other.getIncoming()) {
            return BEFORE;
        } else {
            return EQUAL;
        }
    
    }
    

    这将使您获得按 incoming 字段值升序排列的 TopTen 对象。

    【讨论】:

      【解决方案2】:

      尝试在 TopTen 类中实现Comparable 接口并覆盖compareTo 方法以指定您的排序逻辑

      @Override
      public int compareTo(TopTen o) {
          // TODO Auto-generated method stub
          return 0;
      }
      

      (或)

      Collections.sort(SortList, new Comparator<TopTen>(){
                  public int compare(TopTen t1, TopTen t2) {
                      return t1.phonenumber.compareTo(t2.phonenumber);
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-10
        • 1970-01-01
        • 2017-03-05
        • 2018-05-13
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 2013-04-14
        相关资源
        最近更新 更多