Java collections.sort()方法未按预期工作

Java collections.sort()方法未按预期工作,java,collections,Java,Collections,我正在尝试运行一个简单的ArrayList程序。我在其中使用了collections.sort()方法,但没有对输出进行排序。 我使用collections.sort()方法的方式有问题吗 请帮我找出根本原因 import java.util.ArrayList; import java.util.Collections; import java.util.Vector; public class Vector1 { public static

我正在尝试运行一个简单的
ArrayList
程序。我在其中使用了
collections.sort()
方法,但没有对输出进行排序。 我使用
collections.sort()方法的方式有问题吗

请帮我找出根本原因

   import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Vector;

    public class Vector1 {

        public static void main(String args[])
        {
            ArrayList<String> arraylist=new ArrayList<String>();

            arraylist.add("Register.classname");
            arraylist.add("com.jdbc.driver");
            arraylist.add("create Statement");
            arraylist.add("String Sql=Create table hello(column1 Number);");
            arraylist.add("execute Statement");

            Vector<String> vectorlist=new Vector<String>();
            vectorlist.add("Register.classname");
            vectorlist.add("com.jdbc.driver");
            vectorlist.add("create Statement");
            vectorlist.add("String Sql=Create table hello(column1 Number);");
            vectorlist.add("execute Statement");

            Collections.sort(arraylist);
            Collections.sort(vectorlist);

            for(int i=0; i<arraylist.size();i++)
            {
                System.out.println("Arraylist:"+arraylist.get(i));
            }
            for(int j=0;j<arraylist.size();j++)
            {
            System.out.println("Vectorlist:"+vectorlist.get(j));    

            }




        }
    }


    Output:
    Arraylist:Register.classname
    Arraylist:String Sql=Create table hello(column1 Number);
    Arraylist:com.jdbc.driver
    Arraylist:create Statement
    Arraylist:execute Statement
    Vectorlist:Register.classname
    Vectorlist:String Sql=Create table hello(column1 Number);
    Vectorlist:com.jdbc.driver
    Vectorlist:create Statement
    Vectorlist:execute Statement
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.Vector;
公共类向量1{
公共静态void main(字符串参数[])
{
ArrayList ArrayList=新的ArrayList();
add(“Register.classname”);
add(“com.jdbc.driver”);
添加(“创建语句”);
add(“stringsql=createtablehello(column1number);”;
添加(“执行语句”);
向量向量列表=新向量();
vectorlist.add(“Register.classname”);
添加(“com.jdbc.driver”);
添加(“创建语句”);
add(“stringsql=createtablehello(column1number);”;
添加(“执行语句”);
Collections.sort(arraylist);
集合。排序(矢量列表);
对于(int i=0;i这是您的输出:

Register.classname
String Sql=Create table hello(column1 Number);
com.jdbc.driver
create Statement
execute Statement
按字母顺序排列似乎是正确的。你还指望什么


Collections#Sort
使用默认的
compareTo
实现
java.lang.String
,即按字母顺序排列字符串。

输出按字母顺序排列:

Arraylist:Register.classname
Arraylist:String Sql=Create table hello(column1 Number);
Arraylist:com.jdbc.driver
Arraylist:create Statement
Arraylist:execute Statement
记住,A-Z在A-Z之前

为了进行不区分大小写的排序,请使用:

Collections.sort(arraylist, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {              
        return o1.compareToIgnoreCase(o2);
    }
});
Collections.sort(arraylist,newcomparator(){
@凌驾
公共整数比较(字符串o1,字符串o2){
返回o1.比较信号(o2);
}
});
这是排序的。它只是根据一个有序的词典比较进行排序。在Unicode中,所有ASCII大写字母都比ASCII小写字母来得早,这就是您得到结果的原因

如果要进行不区分大小写的比较,则应将
比较器
传递给
集合。排序
——例如

另一方面,此代码已被破坏:

for(int j=0;j<arraylist.size();j++)
{
    System.out.println("Vectorlist:"+vectorlist.get(j));    
}

排序正确。默认字符串排序应用于集合。排序是基于起始字母的ASCII值按升序进行的。

要在使用集合时忽略大小写。sort(),您应该编写自己的比较器

public class IgnoreCase implements Comparator<Object> {
        public int compare(Object i, Object j) {
            String a = (String) i;
            String b = (String) j;
            return a.toLowerCase().compareTo(b.toLowerCase());
        }
    }

Collections.sort(arraylist, new IgnoreCase ());
公共类IgnoreCase实现了Comparator{
公共整数比较(对象i、对象j){
字符串a=(字符串)i;
字符串b=(字符串)j;
返回a.toLowerCase().compareTo(b.toLowerCase());
}
}
sort(arraylist,newignorecase());

您的输出按字母顺序正确排序

正如您在ascii表格
http://www.asciitable.com/
大写字符位于小写字符之前

因此:

  • XXXXXXXX:String Sql=Create table hello(第1列编号);
先于:

  • XXXXXXXX:com.jdbc.driver
    如果它们的前缀相同
如果要对字符串进行排序而不考虑大小写,请使用不区分大小写的比较器:

Collections.sort(arraylist, String.CASE_INSENSITIVE_ORDER);
Collections.sort(vectorlist, String.CASE_INSENSITIVE_ORDER);
那么您的输出将是:

输出:

Arraylist:com.jdbc.driver
Arraylist:create Statement
Arraylist:execute Statement
Arraylist:Register.classname
Arraylist:String Sql=Create table hello(column1 Number);
Vectorlist:com.jdbc.driver
Vectorlist:create Statement
Vectorlist:execute Statement
Vectorlist:Register.classname
Vectorlist:String Sql=Create table hello(column1 Number);

您正在对字符串进行排序,并且排序工作正常。但是,您没有意识到Unicode字符集的结构。Unicode的0-127字符与ASCII字符集相同,大写字母先于小写字母。有关列表,请参阅。因此,Register先于create,依此类推


如果需要区分大小写的排序或区分区域性的匹配,应该使用
Collator
CollationKey
类。

您希望在排序的输出中看到什么?第二个for循环的上限应该是
j
@mre vectorList.size()和arrayList.size()都一样size@ling.s,我知道,OP是幸运的。停止投票,看看skeety答案:)+1,让我惊讶的是,即使是简单的问题,我仍然可以学到一些东西,谢谢Jon!谢谢Jon和你们所有人。我忘了ASCII大写字母比ASCII小写字母来得早。
Arraylist:com.jdbc.driver
Arraylist:create Statement
Arraylist:execute Statement
Arraylist:Register.classname
Arraylist:String Sql=Create table hello(column1 Number);
Vectorlist:com.jdbc.driver
Vectorlist:create Statement
Vectorlist:execute Statement
Vectorlist:Register.classname
Vectorlist:String Sql=Create table hello(column1 Number);