如何按字母顺序排序而忽略大小写?

74

我有这段代码,但它只适用于小写字母。 我希望它能在排序列表时忽略大写字母。

package sortarray.com;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class SortArray extends Activity {
    ArrayList<String[]> matchedFruits = new ArrayList<String[]>();
    TextView selection;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String fruits[] = new String[7];// Sorted array
        fruits[0] = "apple";
        fruits[1] = "apricot";
        fruits[2] = "banana";
        fruits[3] = "mango";
        fruits[4] = "melon";
        fruits[5] = "pineapple";
        fruits[6] = "peach";
        char currChar = fruits[0].charAt(0);// Get first char of first element

        boolean match = false;
        int len = fruits.length;
        List<String> tmp = new ArrayList<String>();

        for (int i = 1; i < len; i++) {
            Log.d("Comparing ", fruits[i].charAt(0) + "," + currChar);
            if (fruits[i].charAt(0) == currChar) {
                if (match == false)// new match?
                {
                    match = true;// Reset search
                    tmp.clear();// clear existing items
                    tmp.add(fruits[i - 1]);
                    Log.d("Started new list ", fruits[i - 1]);
                } else {
                    tmp.add(fruits[i - 1]);
                    Log.d("Added to list ", fruits[i - 1]);
                }
            } else {
                match = false;
                tmp.add(fruits[i - 1]);
                matchedFruits.add(tmp.toArray(new String[tmp.size()]));// add to
                                                                        // final
                                                                        // list
                Log.d("Finished a list ", fruits[i - 1]);
                tmp.clear();// clear existing items

            }
            currChar = fruits[i].charAt(0);

        }
        tmp.add(fruits[len - 1]);
        matchedFruits.add(tmp.toArray(new String[tmp.size()]));// add left over
                                                                // items
        printList();
    }

    void printList()
    {
    //Print the list 
        TextView selection = (TextView) findViewById(R.id.tv);
        String mssg="";
    for(int i=0;i<matchedFruits.size();i++)
    {
            String tmp2[]= matchedFruits.get(i);

            for (int j = 0; j < tmp2.length; j++) {
                //Log.d("Final list", "Array #" + i + "[" + j + "]," + tmp2[j]);
                mssg += tmp2[j].toString();

            }
            //selection.setText("\n");
            selection.setText(mssg);

    }
    }
}

3
为什么不在数组或集合中使用sort()或类似方法? - Tobias
@jitender:你想做什么?能详细说明一下吗? - Adil Soomro
我想按字典顺序对列表进行排序,同时忽略大小写字母...即如果我写了man和Mango,它们在排序后会在列表中排在一起。 - user934357
我认为Jitender正在寻找一种“自然排序”方式,但我不知道为什么没有使用Collections.sort! - David Snabel-Caunt
@Tobiask...先生,我是一个初学者,对此有一点点的了解,请指导我如何使用它。 - user934357
@ David Caunt 先生,我是一个初学者,不知道如何使用 Collections.sort。 - user934357
16个回答

193
Collections.sort(listToSort, String.CASE_INSENSITIVE_ORDER);

18
无需创建自己的不区分大小写字符串比较器,只需使用String.CASE_INSENSITIVE_ORDER(自Java 1.2起)。 - Neon
如果我想传递两个属性,比如不区分大小写的顺序和反向顺序,该怎么办? - Luis A. Florit
在这种情况下,您可能需要使用比较器。 - Narendra Singh
1
值得注意的是,这将修改现有列表,因此列表需要是可变的。 - Andrejs
1
你也可以这样写:theList.sort(String.CASE_INSENSITIVE_ORDER)。 - Rob Stoecklein
对于对对象数组列表进行排序,我们确实需要编写一个比较器。 - Shamsul Arefin

48

你的意图非常不清楚,但是你可以按照以下方式对列表进行排序:

List<String> fruits = new ArrayList<String>(7);

fruits.add("Pineapple");
fruits.add("apple");
fruits.add("apricot");
fruits.add("Banana");
fruits.add("mango");
fruits.add("melon");        
fruits.add("peach");

System.out.println("Unsorted: " + fruits);

Collections.sort(fruits, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {              
        return o1.compareToIgnoreCase(o2);
    }
});

System.out.println("Sorted: " + fruits);

先生,我想按字母顺序对我的列表进行排序。但是我的代码只适用于小写单词,它会将大写单词打印在列表底部。现在我想要的是无论大小写如何都可以按字母顺序对列表进行排序。 - user934357
先生你好,能请您帮我看看这个问题吗?http://stackoverflow.com/questions/7525851/how-to-add-a-line-as-a-gesture-while-moving-from-one-image-to-another - user934357
@ David Caunt 没关系,先生,我会自己解决的。 - user934357

40

Collections.sort() 允许你传递一个自定义的比较器来进行排序。对于不区分大小写的排序,String 类提供了一个名为 CASE_INSENSITIVE_ORDER 的静态 final 比较器。

因此在您的情况下,只需要:

Collections.sort(caps, String.CASE_INSENSITIVE_ORDER);

3
显然是最佳答案 :) - Aerilys

34

这是一个简单的Java示例,展示了最佳实践:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Sorter {
    String fruits[] = new String[7];
    List<String> lst;

    Sorter() {
        lst = new ArrayList<String>();
        // initialise UNSORTED array
        fruits[0] = "Melon"; fruits[1] = "apricot"; fruits[2] = "peach";
        fruits[3] = "mango"; fruits[4] = "Apple";   fruits[5] = "pineapple";
        fruits[6] = "banana";
    }

    public static void main(String[] args) {
        Sorter srt = new Sorter();
        srt.anyOldUnstaticMethod();

    }
    public void anyOldUnstaticMethod() {
        Collections.addAll(lst, fruits);
        System.out.println("Initial List");
        for (String s : lst)
            System.out.println(s);
        Collections.sort(lst);
        System.out.println("\nSorted List");
        for (String s : lst)
            System.out.println(s);
        Collections.sort(lst, new SortIgnoreCase());
        System.out.println("\nSorted Ignoring Case List");
        for (String s : lst)
            System.out.println(s);
    }

    public class SortIgnoreCase implements Comparator<Object> {
        public int compare(Object o1, Object o2) {
            String s1 = (String) o1;
            String s2 = (String) o2;
            return s1.toLowerCase().compareTo(s2.toLowerCase());
        }
    }
}

https://dev59.com/tnVC5IYBdhLWcg3wtzqs - Jared Burrows
7
这比必须的更加复杂。 - John R Perry

17
我不敢相信没有人提到Collator。几乎所有这些答案都只适用于英语。
你几乎总是应该使用基于字典的排序的Collator
对于不区分大小写的英语语言排序,您可以执行以下操作:
Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY);
Collections.sort(listToSort, usCollator);

listToSort.sort(usCollator); 可以将列表按照美式排序器进行排序。 - Roeland Van Heddegem

6

自Java 8以来,您可以使用Streams API进行排序:

List<String> fruits = Arrays.asList("apple", "Apricot", "banana");

List<String> sortedFruit = fruits.stream()
      .sorted(String.CASE_INSENSITIVE_ORDER)
      .collect(Collectors.toList())
Collections.sort 方法会修改原有的列表,而此方法将会返回一个新的列表,不会修改原有列表。

5

我喜欢比较器类SortIgnoreCase,但我会使用这个

public class SortIgnoreCase implements Comparator<String> {
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);    // Cleaner :)
    }
}

1
为什么不在钻石操作符中使用<String>类型,以避免强制转换为String? - Christophe Roussy
1
@ChristopheRoussy 没有其他原因,可能只是当时我没有想到或看到那个选项...那样会更好。 - Java Devil
1
java.lang.String.CASE_INSENSITIVE_ORDER是预定义的。http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#CASE_INSENSITIVE_ORDER - gerardw

5

Java 8中的数组排序方式 -> 轻松愉快

String[] names = {"Alexis", "Tim", "Kyleen", "KRISTY"};

  Arrays.sort(names, String::compareToIgnoreCase);

我使用了方法引用 String::compareToIgnoreCase

4
java.text.Collator.getInstance() 传递给 Collections.sort 方法; 这将按字母顺序排序,同时忽略大小写。
        ArrayList<String> myArray = new ArrayList<String>();
        myArray.add("zzz");
        myArray.add("xxx");
        myArray.add("Aaa");
        myArray.add("bb");
        myArray.add("BB");
        Collections.sort(myArray,Collator.getInstance());

4
你可以直接调用列表的默认排序方法,像这样:sort
myList.sort(String.CASE_INSENSITIVE_ORDER); // reads as the problem statement and cleaner

或者:

myList.sort(String::compareToIgnoreCase);  // reads as the problem statement and cleaner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接