-3

我正在尝试运行一个简单的程序。我在其中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
4

7 回答 7

8

排序的。它只是根据String.compareTo哪个是序数词典比较进行排序。在 Unicode 中,所有 ASCII 大写字母都早于 ASCII 小写字母,这就是您得到结果的原因。

如果要进行不区分大小写的比较,则应将 a 传递Comparator<String>Collections.sort- 例如, a Collator

顺便说一句,这段代码被破坏了:

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

你应该使用vectorlist.size(). 或者,更好的是,使用增强的 for 循环:

for (String item : vectorlist) {
    System.out.println("Vectorlist: " + item);
}
于 2013-04-23T11:11:38.950 回答
2

这是你的输出:

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

这似乎是按字母顺序排列的正确顺序。你还期待什么?

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

于 2013-04-23T11:10:20.120 回答
1

输出按字母顺序排列:

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

请记住,AZ 在 az 之前。

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

Collections.sort(arraylist, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {              
        return o1.compareToIgnoreCase(o2);
    }
});
于 2013-04-23T11:11:08.760 回答
0

排序是正确的。默认字符串排序应用于集合。根据起始字母的 ASCII 值升序排序

于 2013-04-23T11:12:36.437 回答
0

要在使用 Collection.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 ());
于 2013-04-23T11:15:30.480 回答
0

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

正如您在 ascii 表中看到的,http://www.asciitable.com/大写字符位于小写字符之前。

所以:

  • XXXXXXXX:String Sql=Create table hello(column1 Number);

先来:

  • 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);
于 2013-04-23T11:16:04.513 回答
0

您正在对字符串进行排序,并且排序工作正常。但是,您没有意识到 Unicode 字符集的结构。Unicode 的字符 0-127 与 ASCII 集相同,大写字母在小写字母之前。有关列表,请参见http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters。因此,Register先于create,依此类推。

如果您想要不区分大小写的排序或区分文化的匹配,您应该使用CollatorandCollationKey类。

于 2013-04-23T11:17:54.807 回答