【问题标题】:java sort using anonymous classjava使用匿名类排序
【发布时间】:2012-05-20 06:30:00
【问题描述】:

我有一个班级,我正在对列表进行排序。

import java.util.*;

public class First 
{

    private static HashMap<String,Second> msgs;

    public static void main(String[] args) 
    {           

    List<String> ls=new ArrayList<String>();


   ls.add("fourth");
   ls.add("2");
   ls.add("second");
   ls.add("first");
   ls.add("third");
   ls.add("1");

   Iterator it=ls.iterator();

   // before sorting
   while(it.hasNext())
   {
     String s=(String)it.next();
     System.out.println(s);
   }

   Collections.sort(ls, new Comparator(){
       public int compare(Object o1, Object o2) {
           return -1;
           // it can also return 0, and 1
        }
    });

System.out.println(" ");

//after sorting
   Iterator iti=ls.iterator();
   while(iti.hasNext())
   {
     String s=(String)iti.next();

     System.out.println(s);
   }

}


}

程序运行后,我得到这些值:

1    
third
first
second
2
fourth

我的问题是 Collection.sort() 函数在这里的行为是什么。从比较函数返回 -1 时,我们得到列表的相反顺序。那我们怎样才能得到其他排序顺序呢?返回0和1的作用是什么?

【问题讨论】:

    标签: java class sorting anonymous


    【解决方案1】:

    最后,我用这种方式修改了排序函数,得到排序后的数据。

     Collections.sort(ls, new Comparator() 
                               {
    
                                public int compare(Object o1, Object o2) 
                                {
                                String sa = (String)o1;
                                String sb = (String)o2;
    
                                int v = sa.compareTo(sb);
    
                                return v;           
    
                                    // it can also return 0, and 1
                                }
                               }    
                        );
    

    【讨论】:

      【解决方案2】:

      你可以这样使用匿名类:

      TreeSet<String> treeSetObj = new TreeSet<String>(new Comparator<String>() {
          public int compare(String i1,String i2)
          {
              return i2.compareTo(i1);
          }
      });
      

      【讨论】:

        【解决方案3】:

        the javadoc 是这样说的:

        int 比较(T o1,T o2)

        比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于 到或大于秒。

        您的比较器实现不遵守此约定,因此结果是不确定的。如果它认为 o1 小于 o2,它必须返回一个负值。如果它认为 o1 大于 o2,它必须返回一个正值。如果它认为 o1 等于 o2,它必须返回 0。它当然必须是一致的。如果 o1 o1。如果 o1

        【讨论】:

          【解决方案4】:

          java.util.Comparator 类在 compare 方法 java 文档中说:

          一个负整数、零或一个正整数作为 第一个参数小于、等于或大于 第二个。

          您可以使用以下代码:

          Collections.sort(ls, new Comparator() 
          {
              public int compare(Object o1, Object o2) 
              {
                 if(o1 instanceof String && o2 instanceof String) 
                 {
                    String s_1 = (String)o1;
                    String s_2 = (String)o2;
          
                    return s_1.compareTo(s_2);
                 } 
                 return 0;    
              }
          });
          

          此代码必须可以正常工作。您可以更改比较方法以获得更大的灵活性。

          String 类中的compareTo 方法在其 java 文档中说:

          0 如果参数字符串等于 这个字符串;如果此字符串,则值小于 0 按字典顺序小于字符串参数;和一个 如果此字符串是,则值大于 0 按字典顺序大于字符串参数。

          【讨论】:

            【解决方案5】:

            返回0和1的作用是什么?

            也就是说o1等于o2,或者o1大于o2。

            您的匿名比较器当前显示 o1 小于 o2,对于 o1o2 的每个可能值。这根本没有意义,并导致sort 的行为不可预测。

            有效的比较器必须实现compare(Object, Object) 方法,以便其行为符合Comparator 接口的要求。


            如果您的真正目的是颠倒列表中元素的顺序,请不要使用sort。使用Collections.reverse()

            【讨论】:

              【解决方案6】:

              来自 Comparator 的 Javadoc

              Compares its two arguments for order.  Returns a negative integer,
               zero, or a positive integer as the first argument is less than, equal
               to, or greater than the second.
              

              所以为你的类定义小于、等于或大于的功能,你缺少等于和大于的功能。

              【讨论】:

                猜你喜欢
                • 2013-11-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-01-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多