12

我有一堂课,我正在对列表进行排序。

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 的作用是什么?

4

6 回答 6

15

最后,我以这种方式修改了排序函数以获取排序后的数据。

 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
                            }
                           }    
                    );
于 2012-05-20T16:09:07.667 回答
8

您可以通过这种方式使用匿名类:

TreeSet<String> treeSetObj = new TreeSet<String>(new Comparator<String>() {
    public int compare(String i1,String i2)
    {
        return i2.compareTo(i1);
    }
});
于 2015-07-03T13:20:21.347 回答
6

这是javadoc所说的:

整数比较(T o1,T o2)

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

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

于 2012-05-20T06:35:02.897 回答
4

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

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

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

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


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

于 2012-05-20T06:35:34.073 回答
4

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

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

您可以使用以下代码:

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

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

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

0如果参数字符串等于该字符串的值;0如果此字符串按字典顺序小于字符串参数,则值小于;0如果此字符串按字典顺序大于字符串参数,则值大于。

于 2012-05-20T06:45:43.633 回答
1

来自 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.

因此,为您的类定义小于、等于或大于的功能,您缺少等于和大于功能。

于 2012-05-20T06:37:01.777 回答