按字母顺序排序arraylist(不区分大小写)

Posted

技术标签:

【中文标题】按字母顺序排序arraylist(不区分大小写)【英文标题】:Sorting arraylist in alphabetical order (case insensitive) 【发布时间】: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

【问题讨论】:

【参考方案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,只是因为长度更小。没有开箱即用的“自然排序”支持,您可能想看看***.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 非常感谢 :) *** 应该为我提供一个选项来保存这样的答案/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)
        

【讨论】:

以上是关于按字母顺序排序arraylist(不区分大小写)的主要内容,如果未能解决你的问题,请参考以下文章

如何在忽略大小写的情况下按字母顺序排序?

按字母顺序对对象的 ArrayList 进行排序

请教如何用python按字母顺序排序英文名字但是不可以用sort函数

JAVA按着字典顺序排序

Hadoop 二次排序

如何按字典顺序对 ArrayList 进行排序?