按字母顺序排序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根据上述答案,我设法比较了我的自定义类对象,如下所示:
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.Collator)是恕我直言正确执行此操作的唯一方法,因为它认为 "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(不区分大小写)的主要内容,如果未能解决你的问题,请参考以下文章