我上课时我正在对列表进行排序。
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的作用是什么?
答案 0 :(得分:12)
最后,我以这种方式修改了sort函数以获取排序数据。
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
}
}
);
答案 1 :(得分:6)
以下是the javadoc所说的内容:
int compare(T o1,T o2)
比较其订单的两个参数。当第一个参数小于等于时,返回负整数,零或正整数 到,或大于第二个。
您的比较器实施不遵守此合同,因此结果是不确定的。如果认为o1小于o2,则必须返回负值。如果认为o1大于o2,则必须返回正值。如果它认为o1等于o2,它必须返回0。当然必须保持一致。如果o1&lt; o2,然后o2> O1。如果o1&lt; o2和o2&lt; o3,然后o1&lt; O3。
答案 2 :(得分:6)
您可以这样使用匿名类:
TreeSet<String> treeSetObj = new TreeSet<String>(new Comparator<String>() {
public int compare(String i1,String i2)
{
return i2.compareTo(i1);
}
});
答案 3 :(得分:4)
返回0和1的作用是什么?
可以说o1等于o2,或者o1大于o2。
您的匿名比较器目前表示,对于o1
和o2
的每个可能值,o1小于o2,。这根本没有意义,导致sort
的行为不可预测。
有效比较器必须实现compare(Object, Object)
方法,以使其符合Comparator
接口的要求。
如果您的真正目的是颠倒列表中元素的顺序,则不要使用sort
。使用Collections.reverse()
答案 4 :(得分: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 doc中说:
如果参数字符串等于,则值0
这个字符串;如果此字符串,则小于0
的值 按字典顺序小于字符串参数;和a 如果此字符串为,则值大于0
按字典顺序大于字符串参数。
答案 5 :(得分:1)
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.
因此,定义小于,等于或大于您的类的功能,您缺少等于和大于功能。