【问题标题】:How to sort alphabetically while ignoring case sensitive?如何在忽略大小写的情况下按字母顺序排序?
【发布时间】:2011-11-20 03:26:27
【问题描述】:

我有这个代码,但只适用于小写字母。我希望它在忽略大写字母的同时对列表进行排序..

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);

    }
    }
}

【问题讨论】:

  • 你为什么不使用 sort() 之类的。像数组或集合那样?
  • @jitender:你想做什么,能详细点吗?
  • 我想按字典顺序对列表进行排序,同时忽略区分大小写的字母......即,如果我写 man 和 Mango,它们在排序后会一起出现在列表中。
  • 我认为 jitender 正在寻找 自然排序 顺序,但我不知道为什么不使用 Collections.sort
  • @Tobiask...先生,我是初学者,所以对此有一点了解,请指导我如何使用它。

标签: java android collections


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    非常不清楚您要做什么,但您可以像这样对列表进行排序:

    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);
    

    【讨论】:

    • 先生,我想按字母顺序对列表进行排序..但是我的代码仅适用于小写单词它的作用是,它将大写单词打印在列表中。现在我想要的是按字母顺序对我的列表进行排序,而不考虑大小写。
    • 您好先生,您能帮我解决这个问题吗..stackoverflow.com/questions/7525851/…
    • @David Caunt 好的,先生,我会自己解决的。
    【解决方案3】:

    这是一个简单的 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());
            }
        }
    }
    

    【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 为什么不在菱形运算符中使用 类型以避免强制转换为 String ?
    • @ChristopheRoussy 没有理由,除了我当时没有想到或看到,也许……会更好。
    • java.lang.String.CASE_INSENSTIVE_ORDER 是预定义的。 docs.oracle.com/javase/7/docs/api/java/lang/…
    【解决方案5】:
    Collections.sort(listToSort, String.CASE_INSENSITIVE_ORDER);
    

    【讨论】:

    • 您不必创建自己的不区分大小写的字符串比较器,只需使用 String.CASE_INSENSITIVE_ORDER(Java 1.2 起)
    • 如果我想传递两个属性,比如不敏感的顺序和逆序呢?
    • @LuisA.Florit 在这种情况下,您可能需要比较器。
    • 值得注意的是,这将修改现有列表,因此列表需要是可变的。
    • 也可以写成:theList.sort(String.CASE_INSENSITIVE_ORDER)
    【解决方案6】:

    使用集合和 ArrayList 的示例:

    开发一个实习生静态类,如示例“CompareStrings”。

    在main方法中调用intern静态类。

    简单易懂,效果很好!

    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);
            }
        }
    }
    

    【讨论】:

      【解决方案7】:

      在您的比较器工厂类中,执行以下操作:

       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;
      

      这使用不区分大小写的比较方法(为什么要自己编写)。这样您就可以像这样使用集合排序:

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

      【讨论】:

        【解决方案8】:

        我不敢相信没有人提到Collator。几乎所有这些答案都只适用于英语。

        您几乎应该始终使用Collator for dictionary based sorting

        对于搜索英语的不区分大小写的整理器,您可以执行以下操作:

        Collator usCollator = Collator.getInstance(Locale.US);
        usCollator.setStrength(Collator.PRIMARY);
        Collections.sort(listToSort, usCollator);
        

        【讨论】:

          【解决方案9】:

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

          所以在你的情况下,所有需要的是:

          Collections.sort(caps, String.CASE_INSENSITIVE_ORDER);
          

          【讨论】:

          • 显然是最佳答案:)
          【解决方案10】:

          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());
          

          【讨论】:

            【解决方案11】:

            在您的情况下,您有一个 List 的字符串,并且大多数已经提出的解决方案(我特别喜欢 @guyblank 的答案)都很好,但是!!!,如果您有一个 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&lt;UserBean&gt; userBeanArray = new ArrayList&lt;UserBean&gt;();,填写并排序:Collections.sort(userBeanArray);

            你已经完成了!

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

            【讨论】:

              【解决方案12】:

              这是一个对数组进行排序的示例:不区分大小写

              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] */

              【讨论】:

                【解决方案13】:

                从 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的不同之处在于,这将返回一个新列表,并且不会修改现有列表。

                【讨论】:

                  【解决方案14】:

                  你可以像这样直接调用列表中默认的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
                  

                  【讨论】:

                    【解决方案15】:

                    Java 8 Way 中的数组排序-> Easy peasy lemon squeezy

                    String[] names = {"Alexis", "Tim", "Kyleen", "KRISTY"};
                    
                      Arrays.sort(names, String::compareToIgnoreCase);
                    

                    我使用的方法参考String::compareToIgnoreCase

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2016-07-05
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-12-14
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-05-20
                      • 2011-08-14
                      相关资源
                      最近更新 更多