【问题标题】:Sorting arraylist in alphabetical order (case insensitive)按字母顺序排序arraylist(不区分大小写)
【发布时间】:2011-08-14 11:57:45
【问题描述】:

我有一个字符串数组列表names,其中包含人名。我想按字母顺序对数组列表进行排序。

ArrayList<String> names = new ArrayList<String>();
names.add("seetha");
names.add("sudhin");
names.add("Swetha");
names.add("Neethu");
names.add("ananya");
names.add("Athira");
names.add("bala");
names.add("Tony");
names.add("Karthika");
names.add("Nithin");
names.add("Vinod");
names.add("jeena");
Collections.sort(names);
for(int i=0; i<names.size(); i++)
    System.out.println(names.get(i));

我尝试以上述方式对列表进行排序。但它将排序后的数组显示为:

Athira
Karthika
..
..
ananya
bala
...

但我不想让它区分大小写。我希望结果为:

ananya
Athira
bala

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    自定义Comparator 应该会有所帮助

    Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s1.compareToIgnoreCase(s2);
        }
    });
    

    或者,如果您使用的是 Java 8:

    list.sort(String::compareToIgnoreCase);
    

    【讨论】:

    • 你能告诉我什么是字符串 s1 和 s2 吗?如果比较函数返回整数值,如何查看结果。
    • @seethalakshmi 这是您列表中的字符串。如果您想了解更多详细信息,请查看 Collections.sort 方法的来源
    • 我想在 logcat 中显示排序列表。我该怎么做?
    • 它将显示为一个对象,除非您在排序后使用循环分解列表。 for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
    • @Dante 如果你看一下String.CASE_INSENSITIVE_ORDER 的实现,那么你会发现A1 比A10 更适合less,只是因为长度更小。没有开箱即用的“自然排序”支持,您可能想看看stackoverflow.com/questions/1262239/…
    【解决方案2】:

    最简单的做法是:

    Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
    

    【讨论】:

    • @djunod,感谢您的回答。我也尝试过从 A1 到 A10 的 ArrayList 解决方案,但 A10 的排序不正确,就像 denis.solenenko 的解决方案一样。不知何故,A10 追随 A1。基本上,它排序为 A1、A10、A2、A3 等。为什么会发生这种情况以及如何正确排序列表?
    • @dante,这是正常的字符串排序。如果您希望 A2 在 A10 之前出现,则必须将其更改为 A02 等。
    • Plus 1. 也适用于 Android。谢谢和祝贺。
    • @djunod 非常感谢 :)
    • stackoverflow 应该为我提供一个选项来保存这样的答案/sn-ps..
    【解决方案3】:

    试试这个代码

    Collections.sort(yourarraylist, new SortBasedOnName());
    
    
    
    import java.util.Comparator;
    import com.RealHelp.objects.FBFriends_Obj;
    import com.RealHelp.ui.importFBContacts;
    
    public class SortBasedOnName implements Comparator
    {
    public int compare(Object o1, Object o2) 
    {
    
        FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class
        FBFriends_Obj dd2 = (FBFriends_Obj)o2;
        return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name
    }
    
    }
    

    【讨论】:

    • 很好的答案!我认为如果您将 'implements Comparator' 更改为 'implements Comparator 并将比较中的 Object 类型更改为 FBFriends_Obj 那么您不需要 dd1 和 dd2 您可以直接在 return 语句中使用 o1 和 o2
    【解决方案4】:

    根据上述答案,我设法比较了我的自定义类对象,如下所示:

    ArrayList<Item> itemList = new ArrayList<>();
    ...
    Collections.sort(itemList, new Comparator<Item>() {
                @Override
                public int compare(Item item, Item t1) {
                    String s1 = item.getTitle();
                    String s2 = t1.getTitle();
                    return s1.compareToIgnoreCase(s2);
                }
    
            });
    

    【讨论】:

      【解决方案5】:

      不幸的是,到目前为止,所有答案都没有考虑到"a" 在排序时不能被视为等于"A"

      String[] array = {"b", "A", "C", "B", "a"};
      
      // Approach 1
      Arrays.sort(array);
      // array is [A, B, C, a, b]
      
      // Approach 2
      Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
      // array is [A, a, b, B, C]
      
      // Approach 3
      Arrays.sort(array, java.text.Collator.getInstance());
      // array is [a, A, b, B, C]
      

      在方法 1 中,任何小写字母都被认为大于任何大写字母。

      方法 2 使情况变得更糟,因为 CASE_INSENSITIVE_ORDER 认为 "a""A" 相等(比较结果为 0)。这使得排序变得不确定。

      方法 3(使用 java.text.Collat​​or)是恕我直言正确执行此操作的唯一方法,因为它认为 "a""A" 不相等,但根据当前(或任何其他需要的)语言环境。

      【讨论】:

        【解决方案6】:

        您需要使用自定义比较器,它将使用compareToIgnoreCase,而不是 compareTo。

        【讨论】:

        • 我试过这个链接。但我找不到解决方案。你能解释一下
        【解决方案7】:

        Java 8 开始,您可以使用Stream

        List<String> sorted = Arrays.asList(
                                  names.stream().sorted(
                                      (s1, s2) -> s1.compareToIgnoreCase(s2)
                                  ).toArray(String[]::new)
                              );
        

        它从ArrayList 获取一个流,然后对其进行排序(忽略大小写)。之后,将流转换为数组,然后再转换为ArrayList

        如果您使用以下方式打印结果:

        System.out.println(sorted);
        

        你会得到以下输出:

        [ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]
        

        【讨论】:

          【解决方案8】:

          KOTLIN 开发人员

          对于自定义列表,如果你想基于一个字符串排序那么你可以使用这个:

          phoneContactArrayList.sortWith(Comparator { item, t1 ->
                  val s1: String = item.phoneContactUserName
                  val s2: String = t1.phoneContactUserName
                  s1.compareTo(s2, ignoreCase = true)
              })
          

          【讨论】:

            【解决方案9】:
            def  lst = ["A2", "A1", "k22", "A6", "a3", "a5", "A4", "A7"]; 
            
            println lst.sort { a, b -> a.compareToIgnoreCase b }
            

            这应该能够以不区分大小写的方式进行排序,但我不确定如何处理字母数字字符串列表

            【讨论】:

              【解决方案10】:

              科特林。按字符串字段排序对象,不区分大小写。

              items?.sortedWith { o1, o2 ->
                          o1.name.compareTo(o2.name, true)
                      }
              

              【讨论】:

                猜你喜欢
                • 2012-09-20
                • 2023-03-27
                • 1970-01-01
                • 2018-12-14
                • 2011-01-30
                • 1970-01-01
                • 2011-07-25
                • 1970-01-01
                • 2023-04-10
                相关资源
                最近更新 更多