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

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个回答

2
在您的比较器工厂类中,可以按如下方式进行操作:
 private static final Comparator<String> MYSTRING_COMPARATOR = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
      return s1.compareToIgnoreCase(s2);
    }
  };

  public static Comparator<String> getMyStringComparator() {
    return MYSTRING_COMPARATOR;

这里使用了compareTo方法,该方法不区分大小写(为什么要自己编写一个)。这样,您就可以像下面这样使用Collections sort:

List<String> myArray = new ArrayList<String>();
//fill your array here    
Collections.sort(MyArray, MyComparators. getMyStringComparator());

2

我们可以在比较器中传递字段和不区分大小写的参数

Collections.sort(list, Comparator.comparing(Ticket::getName, String.CASE_INSENSITIVE_ORDER));

0
在您的情况下,您有一组字符串的List,并且大多数已经提出的解决方案(我特别喜欢@guyblank的答案)都很好。但是,如果您有一组bean的List,这是我的情况,您可以像这样在bean中使用Comparable接口:
public class UserBean implements Comparable<UserBean> {

   private String name;
   private String surname;        
   private Integer phone;

   // GETTERS AND SETTERS

   public int compareTo(UserBean bean) {
       return name.compareToIgnoreCase(bean.name);
   }

}

然后你只需要创建你的ArrayList<UserBean> userBeanArray = new ArrayList<UserBean>();,填充它并排序:Collections.sort(userBeanArray);

这样就完成了!

希望对社区有所帮助 ;-)


0

使用集合和ArrayList的示例:

开发一个类似于示例“CompareStrings”的内部静态类。

在主方法中调用内部静态类。

易于理解且运行良好!

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

public class MainClass {
    public static void main(String[] args) {
        ArrayList<String> myArray = new ArrayList<String>();
        myArray.add("zzz");
        myArray.add("xxx");
        myArray.add("Aaa");
        myArray.add("bb");
        myArray.add("BB");
        Collections.sort(myArray, new MainClass.CompareStrings());
        for(String s : myArray) {
            System.out.println(s);
        }
    }

    public static class CompareStrings implements Comparator<String> {
        @Override
        public int compare(String s1, String s2) {
           return s1.compareToIgnoreCase(s2);
        }
    }
}

0

你尝试过将字符串的第一个字符转换为小写字母吗?在if(fruits[i].charAt(0) == currChar)char currChar = fruits[0].charAt(0)语句中。


-1

这里有一个对数组进行排序的例子:不区分大小写

import java.text.Collator;
import java.util.Arrays;

public class Main {
  public static void main(String args[]) {

    String[] myArray = new String[] { "A", "B", "b" };
    Arrays.sort(myArray, Collator.getInstance());

  System.out.println(Arrays.toString(myArray));

 }

}

/* 输出:[A,b,B] */


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